#error #error-handling #local #fatal #result #nightly #enums

无 std woah

一种区分可处理本地错误和不可处理的致命错误的 Result 类型

10 个不稳定版本 (3 个破坏性更新)

0.4.5 2022 年 5 月 25 日
0.4.4 2022 年 5 月 24 日
0.3.0 2022 年 5 月 22 日
0.2.0 2021 年 8 月 3 日
0.1.9 2020 年 9 月 2 日

#816Rust 模式

每月 25 次下载

MIT/Apache

72KB
1K SLoC

woah

Crates.io Crates.io

一种将可处理的本地错误和不可处理的致命错误分开的 Result

有时候,你希望能够在不处理某些错误的情况下将错误向上传递,同时方便地在本地级别处理其他类型的错误。你可能试图通过在 Result 上进行手动模式匹配,或者通过构建 Result<Result<T, LocalError>, FatalError> 来实现这一点。相反,你可以使用 woah

示例

use woah::prelude::*;
use rand::prelude::*;

fn main() {
    match get_data() {
        Success(data) => println!("{}", data),
        LocalErr(e) => eprintln!("error: {:?}", e),
        FatalErr(e) => eprintln!("error: {:?}", e),
    }
}

/// Get data from an HTTP API.
fn get_data() -> Result<String, LocalError, FatalError> {
    match do_http_request()? {
        Ok(data) => Success(data),
        Err(e) => {
            eprintln!("error: {:?}... retrying", e);
            get_data()
        }
    }
}

/// Make an HTTP request.
///
/// This is simulated with randomly returning either a time out
/// or a request failure.
fn do_http_request() -> Result<String, LocalError, FatalError> {
    if random() {
        LocalErr(LocalError::RequestTimedOut)
    } else {
        FatalErr(FatalError::RequestFailed)
    }
}

/// Errors which can be handled.
#[derive(Debug)]
enum LocalError {
    RequestTimedOut,
}

/// Errors which can't be handled.
#[derive(Debug)]
enum FatalError {
    RequestFailed,
}

使用

woah 可以在稳定版 Rust 中使用,但在 nightly 版本中使用最佳。

在 nightly 版本中,启用 nightly 功能后,你可以使用 Try trait,它允许使用 ? 操作符来传播致命错误。在稳定版中,你必须将 std::result::Result 转换为 ? 操作符,这不太方便。

特性

特性名称 默认? 目的
nightly 允许使用 ? 操作符与 woah::Result,并添加基于 std 中不稳定 API 的一些其他便利 trait 实现。
std 使用 std 进行导入,添加 TerminationExitCode API,如果启用 either,则将 std 启用为 either
either woah::Result 添加方法,以便与 Either<LocalErr, FatalErr> 进行操作
serde woah::Result 实现 SerializeDeserialize

许可证

woah 采用 MIT 或 Apache 2.0 双重许可。

依赖项

~220KB