#error #actix-web #applications #web-apps #cleanly #response #internal

actix-plus-error

一个与actix-web集成的库,提供了ResponsError类型(及其相关特质),以便在actix-web应用程序中干净地传播所有类型的错误。

1 个不稳定版本

0.1.0 2021年4月5日

#99#internal


用于 2 crates

MIT/Apache

12KB
82

概述

此crate提供了一个方便、方便且通用的方式来处理actix-web应用程序中的错误。所有错误可以分为三类:内部服务器错误、导致用户收到某些HTTP错误的错误(例如,发送无效字符串作为电子邮件),以及实际上根本不是错误的错误(例如,在登录时使用电子邮件发送错误密码——实际上没有发生任何问题,因为这是一个预期的过程)。前两类错误以以下方式定义的定制错误类型表示(从实际库代码中修改以更清楚地说明观点)

pub enum ResponseError{
    InternalServerError(Box<dyn Error + Any>),
    StatusCodeError { code: actix_web::http::StatusCode, message: String },
}

此错误类型能够通过?运算符传播任何实现Error的类型,从而允许方便且干净地处理内部服务器错误,并且能够使用相同的运算符在函数之间传播StatusCodeError变体实例,从而允许这些错误被干净地传播。例如,如果一个查看论坛帖子的路由调用另一个从数据库中检索该线程的函数,但请求了一个不存在的线程,那么该数据库函数可以简单地返回一个编码了404 Not Found Request的ResponseError,然后通过?运算符传播回Actix,可能通过一系列调用。这允许用户只需编写直接处理标准情况的代码,其他情况则隐式、干净且清晰地处理,从而减少开发时间。

对于第三类错误,建议使用200 OK响应和JSON(或类似格式)来指定结果。

当我需要直接处理错误时怎么办?

当然,这种有意见的处理错误的方法并不总是奏效——有时在例如数据库函数无法找到请求的项目时(例如,调用另一个数据库函数),人们可能想要做一些特别的事情。在actix-plus-error中,这仍然可行,因为人们可以像匹配其他任何错误(甚至状态码)一样匹配错误。

async fn fetch_something(uuid: Uuid) -> ResponseResult<Something>{
    match fetch_something_from_db(uuid).await {
        Ok(something) => Ok(something),
        Err(ResponseError::StatusCodeError { code: StatusCode::NOT_FOUND, .. }) => { // a 403 forbidden status code, for example, is propagated
            //return a default Something
            Ok(Something::default())
        },
        Err(other_error) => Err(other_error) //propagate other errors (e.g. internal server errors, other status codes)
    }
}

也可以使用Any特质将包装在InternalServerError变体中的错误向下转换。

依赖项

~27MB
~579K SLoC