14个版本
0.3.1 | 2022年2月11日 |
---|---|
0.3.0 | 2020年10月29日 |
0.2.4 | 2020年4月9日 |
0.2.3 | 2020年3月5日 |
0.1.4 | 2018年12月27日 |
#312 在 过程宏 中
78,337 每月下载量
在 不到 79 个 Crate 中使用
22KB
310 行
err-derive
一个类似失败的派生宏,用于 std Error
。源代码大部分来自 failure-derive
。
最小Rust版本:1.34.0
动机
为什么还需要另一个错误处理库?已经有十几个了,最受欢迎的是
前者提供了一个很好的 #[derive(Fail)]
宏,但它使用自己的错误类型(Fail
),并且由于 std::error::Error
正在得到修复以提供与 Fail
相同的好处,因此其使用并不被鼓励。
error-chain
支持 std::error::Error
,但它使用声明性语法生成错误实现,这在我的看法中使得语法过于晦涩。
这个crate试图结合两者的优点
- 与
std::error::Error
一起工作 - 提供一个自定义的
#[derive(Error)]
,其工作方式与failure-derive
相同
err-derive
与 std
兼容,包括最近对弃用 Error::cause
并推荐使用 Error::source
的更改,并提供生成 Display
和 Error
模板代码的简单语法(后者99%来自 failure-derive
)。
功能
err-derive
可应用于您的错误结构体/枚举,并为您执行以下操作:
- 派生
Display
实现 - 派生
Error
实现(实现source
以返回错误原因) - 派生
From<OtherError>
实现
使用方法
Cargo.toml
[dependencies]
err-derive = "0.1"
Rust 代码
#[cfg(feature = "std")]
use std::error::Error;
#[cfg(not(feature = "std"))]
use std::fmt::Display;
use std::path::PathBuf;
use err_derive::Error;
#[derive(Debug, Error)]
pub enum FormatError {
#[error(display = "invalid header (expected: {:?}, got: {:?})", expected, found)]
InvalidHeader {
expected: String,
found: String,
},
#[error(display = "missing attribute: {:?}", _0)]
MissingAttribute(String),
}
#[derive(Debug, Error)]
pub enum LoadingError {
#[error(display = "could not decode file")]
FormatError(#[error(source)] FormatError),
#[error(display = "could not find file: {:?}", path)]
NotFound { path: PathBuf },
}
fn main() {
let my_error: LoadingError = FormatError::MissingAttribute("some_attr".to_owned()).into();
print_error(&my_error);
}
#[cfg(feature = "std")]
fn print_error(e: &dyn Error) {
eprintln!("error: {}", e);
let mut cause = e.source();
while let Some(e) = cause {
eprintln!("caused by: {}", e);
cause = e.source();
}
}
#[cfg(not(feature = "std"))]
fn print_error(e: &dyn Display) {
eprintln!("error: {}", e);
}
no_std
您可以通过禁用默认的 std
功能来在 #![no_std]
项目中使用此库。
[dependencies]
err-derive = { version = "...", default-features = false }
没有默认的 std
功能,只有 From
和 Display
实现将被派生,因为 Error
需要 std
。
致谢
感谢 @withoutboats 和 failure的其他贡献者。
许可
本项目采用 Apache-2.0 / MIT 双重许可。您可以选择其中一种许可。对项目的任何贡献都假定根据这些条款进行许可。
有关更多信息,请参阅 LICENSE、LICENSE-MIT 和 LICENSE-APACHE。
依赖项
~1–10MB
~118K SLoC