2个不稳定版本
0.2.0 | 2023年5月5日 |
---|---|
0.1.0 | 2022年8月15日 |
#15 in #error-derive
41 每月下载量
用于 actix-web-error
21KB
489 行
actix-web-error
为actix-web提供简单易用的错误响应。这个crate通过提供一个类似于thiserror
的API来指定HTTP状态,简化了实现actix_web::ResponseError
的过程。最佳与thiserror结合使用。
目前仅支持JSON响应。
感谢thiserror项目,我使用了其核心结构和核心工具。
错误响应
Json
将以JSON格式响应,形式为{ "error": <Display representation> }
(application/json
)。Text
将以错误的Display
表示形式响应(text/plain
)。
示例
#[derive(Debug, thiserror::Error, actix_web_error::Json)]
#[status(BAD_REQUEST)] // default status for all variants
enum MyError {
#[error("Missing: {0}")]
MissingField(&'static str),
#[error("Malformed Date")]
MalformedDate,
#[error("Internal Server Error")]
#[status(500)] // specific override
Internal,
}
#[derive(Debug, thiserror::Error, actix_web_error::Text)]
#[error("Item not found")]
#[status(404)]
struct MyOtherError;
这大致可以展开为
use actix_web::{ResponseError, HttpResponse, HttpResponseBuilder, http::StatusCode};
#[derive(Debug, thiserror::Error)]
enum MyError {
#[error("Missing: {0}")]
MissingField(&'static str),
#[error("Malformed Date")]
MalformedDate,
#[error("Internal Server Error")]
Internal,
}
#[derive(Debug, thiserror::Error)]
#[error("Item not found")]
struct MyOtherError;
impl ResponseError for MyError {
fn status_code(&self) -> StatusCode {
match self {
Self::Internal => StatusCode::from_u16(500).unwrap(),
_ => StatusCode::BAD_REQUEST,
}
}
fn error_response(&self) -> HttpResponse {
HttpResponseBuilder::new(self.status_code())
.json(serde_json::json!({ "error": self.to_string() }))
}
}
impl ResponseError for MyOtherError {
fn status_code(&self) -> StatusCode {
// With at least opt-level=1, this unwrap will be removed,
// so this function will essentially return a constant.
StatusCode::from_u16(404).unwrap()
}
}
依赖项
~0.8–1.3MB
~27K SLoC