#error #archived #chaining #display #prefix #pain

error-rules

已归档!无痛苦的错误处理

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

MIT 许可证

17KB
228

error-rules

docs

已归档

项目已归档。我建议使用 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