8 个版本
0.2.1 | 2024 年 2 月 29 日 |
---|---|
0.2.0 | 2024 年 2 月 28 日 |
0.1.7 | 2024 年 2 月 20 日 |
#444 in Rust 模式
135KB
2K SLoC
Wallee
此库提供了 wallee::Error
,这是一个基于 trait object 的错误类型,用于在 Rust 应用程序中轻松进行惯用错误处理。
此 crate 是 anyhow
的分支,支持调用者位置跟踪。当构建中未包含调试信息时,这非常有用。附加到 wallee::Error
的调用者位置包括错误起源的文件、行和列。
[dependencies]
wallee = "0.1"
编译器支持:需要 rustc 1.76+
详细信息
-
使用
Result<T, wallee::Error>
或等效的wallee::Result<T>
作为任何可能失败的函数的返回类型。在函数内,使用
?
传播实现了std::error::Error
特质的任何错误。use wallee::Result; fn get_cluster_info() -> Result<ClusterMap> { let config = std::fs::read_to_string("cluster.json")?; let map: ClusterMap = serde_json::from_str(&config)?; Ok(map) }
-
附加上下文以帮助调试人员理解问题所在。在没有更多上下文信息的情况下,例如“没有找到文件或目录”,低级错误可能难以调试。
use wallee::{Context, Result}; fn main() -> Result<()> { ... it.detach().context("Failed to detach the important thing")?; let content = std::fs::read(path) .with_context(|| format!("Failed to read instrs from {}", path))?; ... }
Error: Failed to read instrs from ./path/to/instrs.json Caused by: No such file or directory (os error 2)
-
支持向下转换,可以根据需要按值、共享引用或可变引用进行。
// If the error was caused by redaction, then return a // tombstone instead of the content. match root_cause.downcast_ref::<DataStoreError>() { Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), None => Err(error), }
-
如果底层错误类型没有提供自己的回溯,则捕获并打印回溯。要查看回溯,必须通过
std::backtrace
中描述的环境变量启用。- 如果您想同时让panic和错误都有回溯,请设置
RUST_BACKTRACE=1
; - 如果您只想让错误有回溯,请设置
RUST_LIB_BACKTRACE=1
; - 如果您只想让panic有回溯,请设置
RUST_BACKTRACE=1
和RUST_LIB_BACKTRACE=0
。
- 如果您想同时让panic和错误都有回溯,请设置
-
Wallee可以与任何实现了
std::error::Error
的错误类型一起工作,包括在您的crate中定义的错误类型。我们不捆绑一个derive(Error)
宏,但您可以自己编写impls或者使用一个独立的宏如thiserror。use thiserror::Error; #[derive(Error, Debug)] pub enum FormatError { #[error("Invalid header (expected {expected:?}, got {found:?})")] InvalidHeader { expected: String, found: String, }, #[error("Missing attribute: {0}")] MissingAttribute(String), }
-
可以使用
wallee!
宏来构建一次性错误消息,该宏支持字符串插值,并生成一个wallee::Error
。return Err(wallee!("Missing attribute: {}", missing));
提供了一个
bail!
宏作为相同早期返回的简写。bail!("Missing attribute: {}", missing);
与failure的比较
wallee::Error
类型的工作方式类似于failure::Error
,但与failure不同,我们的实现是基于标准库的std::error::Error
特质,而不是一个单独的特质failure::Fail
。标准库已经采纳了必要的改进,以便可以在RFC 2504中实现这一点。
与thiserror的比较
如果您不在乎函数返回什么错误类型,只想要它容易实现,请使用Wallee。这在应用程序代码中很常见。如果您是希望设计自己的专用错误类型(s)的库,以便在失败时调用者获得您选择的确切信息,请使用thiserror。
许可证
根据您的选择,在Apache License, Version 2.0或MIT许可证下许可。除非您明确表示,否则根据Apache-2.0许可证的定义,您有意提交的任何贡献,只要包含在本crate中,都将如上所述双重许可,不附加任何额外条款或条件。