6个版本
使用旧的Rust 2015
0.0.5 | 2021年2月26日 |
---|---|
0.0.4 | 2017年10月4日 |
0.0.3 | 2017年1月29日 |
688 在 过程宏 中
每月8,097次下载
用于 288 个crate(直接使用29个)
17KB
311 行
派生Rust错误
该crate使用宏1.1派生自定义错误。
入门
将此crate添加到您的依赖项部分:
[dependencies]
derive-error = "0.0.4"
在您的 main.rs
或 lib.rs
中导入它:
#[macro_use]
extern crate derive_error;
派生错误很简单。只需创建一个枚举用于您的错误,如Rust书中建议的 在Rust书中,使用文档注释为枚举变体添加简短描述,添加一个 #[derive(Debug, Error)]
即可完成。以下是书中示例使用此库的实现:
#[derive(Debug, Error)]
enum CliError {
/// IO Error
Io(io::Error),
/// Failed to parse the CSV file
Csv(csv::Error),
/// No matching cities with a population were found
NotFound,
}
这将派生 Display
、Error
和 From
的实现。有关如何使用此crate的实际情况,请参阅 reql crate。
配置
并非所有错误都是完全相同的,并且需要例如 From
实现等。derive-error支持枚举变体的属性,允许您启用/禁用Error派生函数的某些方面。可以附加到派生 Error
的枚举变体上的有3个属性:non_std
、msg_embedded
、no_from
。
msg_embedded
通过变体中的项目显示错误,通常是一个 String
。
no_from
跳过枚举变体的 From
实现,如果您希望错误不是来自其他地方,并且您的代码基本上是错误源,则希望这样做。
non_std
通过它的文档注释 ///
或嵌入的消息(如果变体有该属性)显示来自变体的错误,否则它将尝试使用变体内部错误的原因。这通常与 no_from
结合使用。
#[derive(Debug, Error)]
enum Error {
#[error(msg_embedded, no_from, non_std)]
RuntimeError(String),
Io(Io::Error),
#[error(non_std, no_from)]
Json(serde_json::Value)
}
此示例展示了如何附加属性。内部 RuntimeError
有一个 String
,在出错的情况下将用于显示。 Io
获得了一个 From
实现用于 Io::Error
,这通常是最常见的用法。也可以直接在错误中嵌入值,在 Json
变体中嵌入一个 Value
,稍后用于其他信息。
这些是从 reql crate 的 derive-error 使用中改编的
依赖项
~1.5MB
~41K SLoC