#backtrace #error #capture #automatic #expect #tiny #wrap

backtrace-error

使用自动回溯捕获和打印结果来包装错误

6 个版本 (破坏性更新)

0.5.1 2024 年 4 月 29 日
0.5.0 2024 年 4 月 29 日
0.4.0 2024 年 4 月 29 日
0.3.0 2022 年 10 月 30 日
0.1.0 2021 年 12 月 18 日

#301Rust 模式

Download history 378/week @ 2024-04-28 6/week @ 2024-05-05 6/week @ 2024-05-19

每月下载 218

MIT/Apache

11KB
104

backtrace-error

这是一个小型 crate,提供了一个小巧的错误包装结构体 BacktraceError,它只具备两个功能

  • 在从其包装类型到 From 的转换过程中捕获回溯(如果开启 RUST_BACKTRACE 等)
  • 在其 Display 实现中格式化打印回溯

它还包括一个扩展特质 ResultExt,您可以使用它来为任何 Result<T, BacktraceError<E>> 提供方法 .unwrap_or_backtrace.expect_or_backtrace。这些方法与 unwrapexpectResult 上的行为相同,但在 Err 上打印回溯,然后再引发恐慌。

最后,它提供了一个 动态 变体,以便您可以在不指定错误类型的情况下进行类型擦除,DynBacktraceError。这与 BacktraceError<E> 的工作方式相同,但将 Box<dyn Error + Send + Sync + 'static> 包装起来,而不是要求特定的错误类型 E,因此可能更昂贵,但更灵活,也可以用作“任何错误”的通用类型,因为它具有 impl<E:Error + Send + Sync + 'static> From<E> 转换。

示例

使用简单:将现有的错误类型放入其中。无需宏!

use backtrace_error::{BacktraceError,ResultExt};
use std::{io,fs};

type IOError = BacktraceError<io::Error>;

fn open_file() -> Result<fs::File, IOError> {
   Ok(fs::File::open("/does-not-exist.nope")?)
}

fn do_stuff() -> Result<fs::File, IOError>
{
    open_file()
}

fn main()
{
    // This will panic but first print a backtrace of
    // the error site, then a backtrace of the panic site.
    let file = do_stuff().unwrap_or_backtrace();
}

或动态地

use backtrace_error::{DynBacktraceError,ResultExt};
use std::{io,fs};

type AppErr = DynBacktraceError;

fn open_file() -> Result<fs::File, AppErr> {
   Ok(fs::File::open("/does-not-exist.nope")?)
}

fn parse_number() -> Result<i32, AppErr> {
   Ok(i32::from_str_radix("not-a-number", 10)?)
}

fn do_stuff() -> Result<(), AppErr>
{
    open_file()?;
    parse_number()?;
    Ok(())
}

fn main()
{
    // This will panic but first print a backtrace of
    // the error site, then a backtrace of the panic site.
    do_stuff().unwrap_or_backtrace();
}

我为写了“另一个Rust错误库”感到非常抱歉,但奇怪的是,我所看到的东西要么不捕获回溯,要么不打印它们,只在一个失败的unwrap上进行调试打印(难以辨认),要么提供一大堆我不需要的功能,通过昂贵的宏实现,或者这些功能的组合。我什么都不需要,我只想在发生错误时捕获回溯,并在稍后某个时候打印出来。

我想可能有人有同样的需求,所以决定发布它。

许可证:MIT OR Apache-2.0

无运行时依赖