2个稳定版本
1.0.1 | 2021年11月27日 |
---|---|
1.0.0 | 2020年6月10日 |
#637 in 调试
10KB
describe_err
想知道这个错误是从哪里来的吗?
在寻找哪些多个I/O错误破坏了你的日常吗?
现在你可以在每个错误中添加简短的描述,并确保你知道发生了什么。如果你不想自己发明,好吧,你只需从代码中生成它们即可!
示例
假设你想在指定的路径上创建文件,并在这里写入给定的字符串。让我们暂时忘记 std::fs::write
存在,并且我们自己来做
fn create_and_write(path: &Path, content: &str) -> Result<(), io::Error> {
let file = File::create(path)?;
write!(file, "{}", content)?;
file.sync_all()
}
这里有三种不同的错误来源,并且不一定总是很明显在特定情况下哪个是真正的错误。这就是 describe_err
处理的方式
use describe_err::{describing, Described};
fn create_and_write(path: &Path, content: &str) -> Result<(), Described<io::Error>> {
let file = describing!(File::create(path))?;
write!(file, "{}", content).map_err(describe("Cannot write to file"))?;
describing!(file.sync_all())
}
这里你可以看到两种使用库的方法
- 通过显式提供
describe
的描述。这个函数返回一个闭包,该闭包将传入的错误映射到Described
实例。 - 通过将产生
Result
的操作包装在describing!
宏中,该宏将错误描述为字符串化内容。
我们可以用这个包装器做什么?
和你对任何其他错误所做的任何事一样。
Described
通过连接提供的描述和原始错误的 Display
输出(由冒号分隔)来实现 Display
。它还实现了 Error
,其中 Error::cause
指向原始错误。因此,你可以轻松地将其与,例如,thiserror
结合使用——顺便说一句,这是 Described
本身所依赖的。
许可证
MIT (c) Cerberuser
依赖项
~285–750KB
~18K SLoC