Error Handling
HttpError
Finchers では、Web アプリケーション内で生じるエラーを HttpError
というトレイトを用いて抽象化します。
HttpError
は error
モジュール内で定義されており、そのシグネチャは以下の通りです。
# #![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
の返す値は隠蔽されており、その後でユーザ側で使用することは現在禁止しています。