Open vislee opened 6 months ago
每个语言都有自己的错误处理,例如:C的errno、C++的try-catch、golang的error interface。 rust也有自己的错误处理,考虑自身语言的特点和几种错误处理的情况,rust使用Error这个trait结合Result这个枚举类型实现。
Error
Result
用作函数的返回,通过match、unwrap、 unwrap_or、 ? 处理结果。
match
unwrap
unwrap_or
?
pub enum Result<T, E> { Ok(T), Err(E), }
// 调试用 pub trait Debug { // Required method fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>; } // 友好输出用 pub trait Display { // Required method fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>; } pub trait Error: Debug + Display { // Provided methods fn source(&self) -> Option<&(dyn Error + 'static)> { ... } fn description(&self) -> &str { ... } fn cause(&self) -> Option<&dyn Error> { ... } fn provide<'a>(&'a self, request: &mut Request<'a>) { ... } }
Debug 和 Display 是 Rust 标准库中的两个不同的 trait,它们都用于定义如何将类型转换为字符串进行输出,但它们有不同的用途和语义。
Debug
Display
一种类型转换为另一种类型
pub trait From<T>: Sized { // Required method fn from(value: T) -> Self; }
https://crates.io/crates/thiserror 该项目通过宏可以自动实现Error和From trait。
thiserror 宏库提供了几个宏,用于定义和定制自定义错误类型。以下是 thiserror 中最常用的宏及其作用:
std::error::Error::source
From
https://crates.io/crates/anyhow 用作函数的返回类型,anyhow::Error封装了dyn std::error::Error。
anyhow::Error
dyn std::error::Error
通过实现From trait支持通过?把错误传播到调用函数,无需主动做类型转换。 通过实现Error trait的source方法,在外层调用函数中调用source显示内部错误。
source
参考: https://baoyachi.github.io/Rust/rust_error_handle.html
概述
每个语言都有自己的错误处理,例如:C的errno、C++的try-catch、golang的error interface。 rust也有自己的错误处理,考虑自身语言的特点和几种错误处理的情况,rust使用
Error
这个trait结合Result
这个枚举类型实现。实现
std::result::Result
用作函数的返回,通过
match
、unwrap
、unwrap_or
、?
处理结果。std::error::Error
Debug
和Display
是 Rust 标准库中的两个不同的 trait,它们都用于定义如何将类型转换为字符串进行输出,但它们有不同的用途和语义。std::convert::From
一种类型转换为另一种类型
thiserror
https://crates.io/crates/thiserror 该项目通过宏可以自动实现Error和From trait。
thiserror 宏库提供了几个宏,用于定义和定制自定义错误类型。以下是 thiserror 中最常用的宏及其作用:
[error("...")]:定义错误的显示消息,用于实现
Display
trait。[source]:标记一个字段作为当前错误的底层来源,用于
std::error::Error::source
方法。[from]:为从另一种错误类型到当前错误类型的转换实现
From
trait,使得可以使用?
操作符自动转换错误类型。[backtrace]:捕获和存储错误发生时的回溯(如果平台和编译器支持),用于调试目的。
anyhow
https://crates.io/crates/anyhow 用作函数的返回类型,
anyhow::Error
封装了dyn std::error::Error
。总结
通过实现
From
trait支持通过?
把错误传播到调用函数,无需主动做类型转换。 通过实现Error
trait的source
方法,在外层调用函数中调用source显示内部错误。参考: https://baoyachi.github.io/Rust/rust_error_handle.html