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 日 |
#301 在 Rust 模式
每月下载 218 次
11KB
104 行
backtrace-error
这是一个小型 crate,提供了一个小巧的错误包装结构体 BacktraceError
,它只具备两个功能
- 在从其包装类型到
From
的转换过程中捕获回溯(如果开启RUST_BACKTRACE
等) - 在其
Display
实现中格式化打印回溯
它还包括一个扩展特质 ResultExt
,您可以使用它来为任何 Result<T, BacktraceError<E>>
提供方法 .unwrap_or_backtrace
和 .expect_or_backtrace
。这些方法与 unwrap
或 expect
在 Result
上的行为相同,但在 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