#error #error-handling #caller #location #line-column #file-line #tracking

no-std wallee

基于 std::error::Error 构建的可扩展具体错误类型,具有调用者位置跟踪功能

8 个版本

0.2.1 2024 年 2 月 29 日
0.2.0 2024 年 2 月 28 日
0.1.7 2024 年 2 月 20 日

#444 in Rust 模式

MIT/Apache

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=1RUST_LIB_BACKTRACE=0
  • 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.0MIT许可证下许可。
除非您明确表示,否则根据Apache-2.0许可证的定义,您有意提交的任何贡献,只要包含在本crate中,都将如上所述双重许可,不附加任何额外条款或条件。

无运行时依赖