6 个版本

使用旧的 Rust 2015

0.2.1 2016年6月8日
0.2.0 2016年5月3日
0.1.3 2016年1月14日

#79#backtrace

每月25 次下载

Apache-2.0/MIT

11KB
85

stacktrace-rs

关于 backtrace 的美化打印器。

该项目已弃用。请考虑查看 error-chain,它是对类似概念更成熟的实现。


lib.rs:

一个用于使用堆栈跟踪的库 Result

Alex Crichton 的优秀 backtrace crate 执行了在各种平台上获取调用栈信息所需的工作。 Stacktrace 尝试使这些信息更易于使用。

快速入门

在您的 Cargo.toml

[dependencies]
stacktrace = "0.2"

在您的项目中

#[macro_use] extern crate stacktrace;

trace!{}

示例用法

有关更多信息,请参阅这些 示例

#[macro_use] extern crate stacktrace;

pub struct Error1(usize);
pub struct Error2(String);

impl From<Error1> for Error2 {
    fn from(err: Error1) -> Error2 {
        Error2(format!("{}", err.0))
    }
}

trace!{Error1 => Error2}

fn makes_a_traced_error() -> Result<(), Trace<Error1>> {
    try!(Err(Error1(1337))); // Uses generic instance of "From<Err>" for "Trace<Err>"
    Ok(())
}

fn propagates_a_traced_error() -> Result<(), Trace<Error2>> {
    try!(makes_a_traced_error()); // Uses the macro-generated instance of "From<Trace<Error1>>" for "Trace<Error2>"
    Ok(())
}

请参阅使用信息部分。

使用信息

此包旨在与二进制包一起使用。它提供了一个宏来定义和使用一个 Trace 结构体,该结构体将错误与关联的堆栈跟踪包装起来。该宏还定义了用于标准 try! 宏的 From 实例。

这些特质的实现是为什么需要在用户的包中用宏定义 Trace 结构体的原因,因为两件事阻止了它们在外部定义

  • 由于标准库中的泛型 impl<A> From<A> for A,我们无法实现一个泛型 impl<A, B: From<A>> From<Trace<A>> for Trace<B>,因为 rustc 首先将其视为 impl From<Trace<_>> for Trace<_>
  • 如果 Trace 定义在这个包中,那么由于特质的协调规则,用户将无法实现 From<A> for Trace<B>

调用 trace!{StructName; A => B, C => D, ...} 将生成一个具有以下实现的 struct StructName<E>

  • 解引用<E>
  • 可变解引用<E>
  • From<A> for StructName<B>,这需要 From<A> for B
  • From<C> for StructName<D> 等。
  • From<StructName<A>> for StructName<B>,这也需要 From<A> for B
  • From<StructName<C>> for StructName<D> 等。
  • Debug,它将以与为 Backtrace 定义的相同格式打印内部错误然后堆栈跟踪。

如果未指定,StructName 默认为 Trace

构建配置文件

对于发布构建,如果您想保留有用的堆栈跟踪信息,请考虑启用调试符号。要做到这一点,请将以下内容添加到您的 Cargo.toml

[profile.release]
debug = true

有关更多信息,请参阅 此处

依赖项

~375KB