9 个版本 (2 个稳定版)
1.0.1 | 2020年10月23日 |
---|---|
1.0.0 | 2019年11月11日 |
0.2.5 | 2019年6月18日 |
0.2.1 | 2019年5月31日 |
0.1.3 | 2019年5月27日 |
#5 在 #archived
每月下载 27 次
用于 plotly-types
17KB
228 行
error-rules
已归档
项目已归档。我建议使用 anyhow + thiserror。
简介
error-rules 是一个 derive 宏,用于实现具有错误链的错误处理程序。宏自动实现将任何错误类型转换为内部枚举字段。
错误转换
#[error_from]
属性实现了从任何错误类型的自动转换。转换的类型应实现 std::error::Error
接口。
use error_rules::*;
#[derive(Debug, Error)]
enum AppError {
#[error_from("App IO: {}", 0)]
Io(std::io::Error),
}
type Result<T> = std::result::Result<T, AppError>;
fn example() -> Result<()> {
let _file = std::fs::File::open("not-found.txt")?;
unreachable!()
}
let error = example().unwrap_err();
assert_eq!(error.to_string().as_str(),
"App IO: No such file or directory (os error 2)");
自定义错误类型
#[error_kind]
属性描述自定义错误类型。可以是字段为空的结构体,也可以是带有字段元组的结构体。
use error_rules::*;
#[derive(Debug, Error)]
enum AppError {
#[error_kind("App: error without arguments")]
E1,
#[error_kind("App: code:{} message:{}", 0, 1)]
E2(usize, String),
}
type Result<T> = std::result::Result<T, AppError>;
fn example_1() -> Result<()> {
Err(AppError::E1)
}
fn example_2() -> Result<()> {
Err(AppError::E2(404, "Not Found".to_owned()))
}
let error = example_1().unwrap_err();
assert_eq!(error.to_string().as_str(),
"App: error without arguments");
let error = example_2().unwrap_err();
assert_eq!(error.to_string().as_str(),
"App: code:404 message:Not Found");
显示属性
#[error_from]
和 #[error_kind]
包含了显示错误时要使用的属性列表。第一个属性应该是字面字符串。其他属性是元组中未命名字段的编号。从 0 开始。
#[error_from]
可以不定义属性,此时等同于 #[error_from("{}", 0)]
错误前缀
#[error_prefix]
属性应该在枚举声明之前定义,并将前缀追加到错误文本中。
use error_rules::*;
#[derive(Debug, Error)]
#[error_prefx = "App"]
enum AppError {
#[error_from]
Io(std::io::Error),
}
type Result<T> = std::result::Result<T, AppError>;
fn example() -> Result<()> {
let _file = std::fs::File::open("not-found.txt")?;
unreachable!()
}
let error = example().unwrap_err();
assert_eq!(error.to_string().as_str(),
"App: No such file or directory (os error 2)");
错误链
通过实现嵌套模块的错误处理,主错误处理器返回完整的错误链。
use error_rules::*;
#[derive(Debug, Error)]
#[error_prefix = "Mod"]
enum ModError {
#[error_from]
Io(std::io::Error),
}
fn mod_example() -> Result<(), ModError> {
let _file = std::fs::File::open("not-found.txt")?;
unreachable!()
}
#[derive(Debug, Error)]
#[error_prefix = "App"]
enum AppError {
#[error_from]
Mod(ModError),
}
fn app_example() -> Result<(), AppError> {
mod_example()?;
unreachable!()
}
let error = app_example().unwrap_err();
assert_eq!(error.to_string().as_str(),
"App: Mod: No such file or directory (os error 2)");
依赖项
~1.5MB
~35K SLoC