#error #result #utility #error-handling

no-std utils-results

最简单最直观的错误处理解决方案

17 个稳定版本 (4 个主要版本)

5.3.0 2021 年 10 月 18 日
5.2.1 2021 年 9 月 2 日
5.1.1 2021 年 8 月 28 日
4.3.1 2021 年 8 月 10 日
1.1.2 2021 年 7 月 29 日

#1502 in Rust 模式

每月 44 次下载
用于 3 crates

MIT/Apache

25KB
207

utils-results

最简单最直观的错误处理解决方案。

Github Forks Github Stars Crates.io Licensed CI Twitter

| 文档 | 最新笔记 |

[dependencies]
utils_results = "5.3.0"

No-std

禁用默认功能(需要分配器)。

[dependencies]
utils_results = { version = "5.3.0", default-features = false }

概览

首先,你应该创建自己的错误集。

err! {
     BrokenHeader => "broken header."
     AnotherHeader => "not matched header."
     FileNotFound => "file not found."
     EmptyArgument => "empty argument."
     UnexpectedEof => "unexpected eof."
     OutOfBounds => "index out of bounds."
     NotMatched => "btw not matched."
}

然后就是 errbang!

errbang!(err::BrokenHeader)

更多示例

fn foo() -> Result<bool> { // Our Master Result Type
    let bar = 2;
    match bar {
        0 => Ok(true),
        1 => Ok(false),
        _ => errbang!(err::NotMatched, "{} is {}", "bar", bar),
    }
}


fn main() -> Result<()> {
    let _is_bar_zero = foo()?;
    Ok(())
}
errbang!("error.");
errbang!(err::MyError1);
errbang!(err::MyError2, "cannot find.");
errbang!(err::MyError3, "{} is {}", "bar", 2);

| Result

[src/main.rs 40:1] unexpected eof. bar is 2 <err::UnexpectedEof>

解包错误输入数据。也可以轻松比较它们。

fn foo() -> Result<()> {
    // example
    return errbang!(err::Bar, "this is input.");
}

assert_eq!(
   errunwrap!(foo(), err::Bar), "this is input."
);

重要

    1. 一个结果类型(anyhow)。
    1. 所有转换的错误都有它们自己的链式错误信息(所有之前的错误)。

如果你遵循以下规则,你可以轻松调试所有项目。

errbang -> errcast -> errcast -> ... -> errcast -> errextract


* 快速概述

use utils_results::*;

err! {
    One => "this error is first one."
    Two => "this error is second one."
    Three => "this error is third one."
    Well => "is this?"
}


fn aaa() -> Result<usize> {
    return errbang!(err::One, "{}.error bang!", 1);
}

fn bbb() -> Result<usize> {
    let n = errcast!(aaa(), err::Two, "{}.two <- one.", 2);
    Ok(n)
}

fn ccc() -> Result<usize> {
    Ok(errcast!(bbb(), err::Three, "{}.three <- two.", 3))
}


fn main() -> Result<()> {
    let c = errextract!(ccc(), err::Well => 127);
    eprintln!("1/{} is cosmological constant.", c);
    Ok(())
}

| Result

Error:


  [src/main.rs 11:12] this error is first one. 1.error bang! <err::One> aaa()
                     ⎺↴
  [src/main.rs 14:13] this error is second one. 2.two <- one. <err::Two> bbb()
                     ⎺↴
  [src/main.rs 18:8] this error is third one. 3.three <- two. <err::Three>


如果匹配的错误已更改,

// Well to Three
let c = errextract!(ccc(), err::Three => 127);

| Result

1/127 is cosmological constant.

errcast

任何类型的错误都可以转换为我们的主错误。 (非 panic 解包)

<解包 Ok> = errcast! (<任何 Result>, <主 Err>, <可选元数据,..>);
// example
let num_read = errcast!(file.read(&mut buf), err::ReadErr, "this is {} data.", "meta");

只需这样做!

let file = errcast!(File::open("test"), err::FileOpenError)

或者...

// Master `Result` can take any errors
let file = File::open("test")?;

// if cfg!(no_std),
let file = io_to_err!(File::open("test"))?;

但是,errcast -> errextract 组合始终是一个好选择。

fn exe(path: &str) -> Result<usize> {
    let file = errcast!(File::open("test"), err::FileOpenError);
    // .....
    // ...
    Ok(num)
}

fn main() -> Result<()> {
    /// non panic unwraping
    /// and specific error can return
    /// matching block
    let num = errextract!(exe(path),
        err::FileOpenError => 0);
    /// other errors will go out -> Result<T>

    Ok(())
}

好吧,我们也可以以更习惯的方式处理 io::Error。(功能 = "std")

匹配 io::Error


 io_err! {
     // io::ErrorKind => err::MyError
     UnexpectedEof => err::MyError1
     Interrupted => err::MyError2
     NotFound => err::MyError3
     // ...
 }

声明匹配宏并处理它。


io_to_err!(file.seek(SeekFrom::End(0)))?;

err_to_io!(my_seek(0))?;


主结果

  • 请使用我们的主 Result<T>
    而不是 std::result::Result 或 io::Result 等。
  • 这是一个 anyhow 结果。

utils-results/lib.rs 定义
/// Master Result
pub type Result<T> = anyhow::Result<T>;

只需将其放入您的项目中。

pub use utils_results::*;

您还可以将任何类型的 Result

// to our Master Result
resultcast!(handle.join().unwrap())?;

依赖项

~130KB