2个版本 (1个稳定版)

1.0.0 2023年4月5日
0.1.0 2023年4月5日

#1189HTTP服务器

每月24次下载

Apache-2.0

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

当遇到ResultOption时,使用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