Error Handling

HttpError

Finchers では、Web アプリケーション内で生じるエラーを HttpError というトレイトを用いて抽象化します。 HttpErrorerror モジュール内で定義されており、そのシグネチャは以下の通りです。


# #![allow(unused_variables)]
#fn main() {
trait HttpError: fmt::Debug + fmt::Display + Send + Sync + 'static {
    fn status_code(&self) -> StatusCode;
    fn headers(&self, h: &mut HeaderMap);
}
#}

このトレイトを実装したエラー値は、同じく error モジュール内にある Error 型へと変換された上でフレームワーク内に保持され、クライアントへのレスポンス構築時にエラーレスポンスへと変換されます。

Recovering

エラー値は通常「例外」としてフレームワーク内で扱われ、レスポンスへの変換は通常自動で行われます。 この挙動をカスタマイズしたい場合、recover というコンビネータを用いることで可能になります。


# #![allow(unused_variables)]
#fn main() {
let endpoint = ...;

endpoint
    .fixed() // ルーティングのエラーを Future として返すようにする
    .recover(|err| -> Result<&'static str, Error> {
        if err.status_code() == StatusCode::NOT_FOUND {
            Ok("not found")
        } else if err.status_code() == StatusCode::BAD_REQUEST {
            Ok("bad request")
        } else {
            Err(err)
        }
    })
#}

recover の返す値は隠蔽されており、その後でユーザ側で使用することは現在禁止しています。