在Rust的错误处理生态系统中,从标准库的std::error::Error
到anyhow
、thiserror
和snafu
,
每个库都在用法和功能上进行了不同程度的改进和演变。
下面是对这些库的改进和设计的详细说明。
标准库的std::error::Error
特点
- 基础特性:定义了一个通用的错误trait,所有错误类型都可以实现这个trait。
- 手动实现:需要手动实现
Display
和Error
trait,比较繁琐。
用法示例
use std::fmt;
#[derive(Debug)]
struct MyError {
details: String,
}
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.details)
}
}
impl std::error::Error for MyError {}
小结
要使用Rust标准库的Error trait实现自定义错误,那么需要做到以下两点:
- 实现
std::fmt::Display
trait,以便将错误信息显示给用户。 - 实现
std::error::Error
trait,以便将错误信息传递给调用者。
anyhow
该库提供了 anyhow::Error,一种基于特征对象(trait object)的错误类型, 用于在 Rust 应用程序中轻松地进行惯用错误处理。
改进
- 简化错误处理:提供了一个基于trait对象的通用错误类型
anyhow::Error
,简化了错误的传播和处理。 - 上下文信息:可以为错误添加上下文信息,帮助调试。
- 自动回溯:自动捕获和打印回溯信息(在Rust 1.65及以上)。