2个版本 (1个稳定版)
1.0.0 | 2023年4月5日 |
---|---|
0.1.0 | 2023年4月5日 |
#1189 在 HTTP服务器
每月24次下载
17KB
310 行
在使用anyhow
时,为axum
提供错误处理辅助程序,重点关注以易于使用的方式安全地解包Result<T, E>
和Option<T>
。
用法
有两种推荐方法可以在您的axum
服务器应用程序中实现recoil
错误处理。
这两种方法都利用了这样一个事实,即由于recoil::Failure
(以及实现recoil::ErrorResponder
的任何内容)生成一个实现axum::response::IntoResponse
的类型,您可以通过调用.into_response
并将其作为http::response::Response
返回给axum
来返回它。
如果-让-错误模式
对于每个可能失败的处理器,返回Response
。
当遇到Result
或Option
时,使用if let
来处理错误分支,然后使用Failure
(或实现ErrorResponder
的任何内容)手动生成错误响应。
use std::fs::write;
use recoil::{ErrorResponder, Failure};
use axum::{
response::{IntoResponse, Response},
http::StatusCode
};
fn your_handler() -> Response {
if let Err(error) = write("/root/warning.txt", "Big brother is watching you.") {
return Failure::fail_because("Failed to write to path /root/warning.txt on file system.", error.into(), None).into_response();
}
// the ok branch continues until the end of the handler.
(StatusCode::CREATED, "Handled successfully.").into_response()
}
// ...rest of your server application code that integrates `your_handler()`.
然而,这种模式是基本的,并为捕获错误分支创建了大量的样板代码。尽管是一个好的起点,但在处理大量错误时,您应该使用更有效的“捕获方法模式”。
捕获方法模式
对于每个可能失败的处理器,返回Result<impl IntoResponse, Response>
。
当遇到一个 Result 或一个
Option 时,可以使用
.recoil()
来处理错误分支,当作用域中存在特质 recoil::Recoil
,然后使用 ?
操作符,来自动生成错误响应。
use std::fs::write;
use recoil::{Failure, Recoil};
use axum::{
response::{IntoResponse, Response},
http::StatusCode
};
fn your_handler() -> Result<impl IntoResponse, Response> {
write("/root/warning.txt", "Big brother is watching you.")
.recoil::<Failure>(Some("Failed to write to path /root/warning.txt on file system."), None)?;
// the ok branch continues until the end of the handler.
Ok((StatusCode::CREATED, "Handled successfully."))
}
// ...rest of your server application code that integrates `your_handler()`.
自定义
如果包含的错误响应结构不符合您的需求,您可以编写自己的,只要它实现了为 ErrorResponder
所需的特质和方法。
请随意使用 recoil::trace_error()
来为您的结构生成错误消息序列。
可以使用自定义响应者与 Recoil::recoil
一起使用,通过指定响应者作为泛型,代替内置的 Failure
结构。
头部
recoil
有意排除自定义错误响应头部的手段,以保持简单。
如果您想自定义头部,请考虑以下方案
- 在您的应用程序中添加中间件以注入头部。
- 不要使用这个库并编写您自己的实现。
http::response::Response
(由 IntoResponse
生成)有 .headers_mut()
方法,它返回对响应内部 HeaderMap
的可变引用,您可以在这里注入您的头部。
依赖项
~6–8.5MB
~147K SLoC