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
25KB
207 行
utils-results
最简单最直观的错误处理解决方案。
[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."
);
重要
-
- 一个结果类型(
anyhow
)。
- 一个结果类型(
-
- 所有转换的错误都有它们自己的链式错误信息(所有之前的错误)。
如果你遵循以下规则,你可以轻松调试所有项目。
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