#错误处理 #结果 #局部 #致命 #OK #处理 #区分

已删除 woe

一种区分局部错误(可处理)和致命错误(不可处理)的结果类型

0.1.8 2020年4月9日
0.1.7 2020年4月9日

#13#致命

每月下载 24 次

MIT/Apache

39KB
934

woe

woe 是一个(目前仅限 nightly)Rust 包,它提供了以下类型

enum Result<T, L, F> {
    Ok(T),
    LocalErr(L),
    FatalErr(F),
}

此类型区分了“局部错误”(可处理)和“致命错误”(不可处理),以实现 Tyler Neely (@spacejam) 在博客文章 "在关键正确性 Rust 项目中的错误处理" 中描述的错误处理模式。 woe::Result 被设计为 Result<Result<T, LocalError>, FatalError> 类型的更方便的替代品。

需要注意的是,在 woe::Result 上使用问号运算符会导致任何 FatalError 向上传播,而提供 Result<T, LocalError> 否则,以启用局部代码处理任何局部错误而不会传播它们。

示例

use std::ops::Try;
use woe::Result::{self, Ok, LocalErr, FatalErr};
use std::result::Result as StdResult;

fn main() {
    match do_thing() {
        StdResult::Ok(num) => println!("Got a number: {}", num),
        StdResult::Err(fatal_err) => eprintln!("Fatal error: {:?}", fatal_err),
    }
}

fn do_thing() -> StdResult<i64, FatalError> {
    let result = do_another_thing(5, 5)?;

    match result {
        StdResult::Err(local_err) => {
            println!("Local error: {:?}", local_err);
            StdResult::Ok(i64::default())
        }
        StdResult::Ok(num) => StdResult::Ok(num),
    }
}

fn do_another_thing(x: i64, y: i64) -> Result<i64, LocalError, FatalError> {
    let result = do_third_thing(x, y)?;
    Result::from_ok(result)
}

fn do_third_thing(x: i64, y: i64) -> Result<i64, LocalError, FatalError> {
    if x > y {
        Ok(x)
    } else if x == y {
        LocalErr(LocalError::SomeError)
    } else {
        FatalErr(FatalError::CatastrophicError)
    }
}

#[derive(Debug)]
enum LocalError {
    SomeError,
    AnotherError,
}

#[derive(Debug)]
enum FatalError {
    BigBadError,
    CatastrophicError,
}

依赖项