1 个不稳定版本
0.6.2 | 2023年3月16日 |
---|
#5 在 #colorful
67 每月下载次数
在 fetcher 中使用
635KB
2K SLoC
color-eyre
一种用于处理panic和eyre
crate的错误报告处理器,旨在为所有类型的错误提供丰富多彩、一致且格式良好的错误报告。
简单来说
color_eyre
帮助你构建如下所示的错误报告
设置
将以下内容添加到你的toml文件中
[dependencies]
color-eyre = "0.6"
并安装panic和错误报告处理器
use color_eyre::eyre::Result;
fn main() -> Result<()> {
color_eyre::install()?;
// ...
# Ok(())
}
禁用跟踪支持
如果你不打算使用 tracing_error
和 SpanTrace
,你可以禁用跟踪集成以减少未使用的依赖项
[dependencies]
color-eyre = { version = "0.6", default-features = false }
默认禁用SpanTrace捕获
color-eyre默认会捕获span跟踪信息。这是因为与 Backtrace
捕获相比,SpanTrace
捕获的成本要低得多。然而,与回溯一样,span跟踪信息对于调试应用程序最有用,并且通常希望默认禁用span跟踪捕获以减少开发者的噪音。
要禁用span跟踪捕获,必须显式设置控制 SpanTrace
捕获的env变量之一为 "0"
if std::env::var("RUST_SPANTRACE").is_err() {
std::env::set_var("RUST_SPANTRACE", "0");
}
提高调试构建的性能
在调试模式下,color-eyre
的表现明显不如 eyre
。这是由于 eyre
使用 std::backtrace::Backtrace
而不是 backtrace::Backtrace
的原因。std版本的后端跟踪是预编译的,这意味着你处于调试模式与否并不重要,后端跟踪捕获的成本始终在数十毫秒内,它将始终在数十毫秒内捕获。然而,backtrace::Backtrace
的调试版本却不幸,捕获回溯所需的时间是其std版本的一个数量级。
通过使用配置文件覆盖,可以缓解这个问题。通过配置项目始终使用优化来构建 backtrace
,您应该能够获得与使用 eyre
时相同的 color-eyre
性能。为此,请将以下内容添加到您的 Cargo.toml 文件中:
[profile.dev.package.backtrace]
opt-level = 3
特性
多种报告格式详细级别
color-eyre
提供了三种不同的报告格式,用于格式化捕获的 SpanTrace
和 Backtrace
:最小化、简短和完整。以下是从 examples/usage.rs
生成的输出片段:
在不设置 RUST_LIB_BACKTRACE
的情况下运行 cargo run --example usage
将产生一个最小化报告,如下所示:
运行 RUST_LIB_BACKTRACE=1 cargo run --example usage
告诉 color-eyre
使用简短格式,该格式还会额外捕获 backtrace::Backtrace
最后,运行 RUST_LIB_BACKTRACE=full cargo run --example usage
告诉 color-eyre
使用完整格式,除了上述内容外,还会尝试包含错误起源的源代码行,假设它能在磁盘上找到它们。
通过 Section
特性实现错误报告的定制 Section
section
模块提供了向错误报告添加额外部分的辅助工具。部分与错误消息不同,并且独立于错误链显示。以下是一个添加部分以包含来自失败命令的 stderr
和 stdout
的示例,取自 examples/custom_section.rs
use color_eyre::{eyre::eyre, SectionExt, Section, eyre::Report};
use std::process::Command;
use tracing::instrument;
trait Output {
fn output2(&mut self) -> Result<String, Report>;
}
impl Output for Command {
#[instrument]
fn output2(&mut self) -> Result<String, Report> {
let output = self.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
Err(eyre!("cmd exited with non-zero status code"))
.with_section(move || stdout.trim().to_string().header("Stdout:"))
.with_section(move || stderr.trim().to_string().header("Stderr:"))
} else {
Ok(stdout.into())
}
}
}
这里有一个函数,如果命令执行不成功,则创建一个指示失败并附加两个部分的报告,一个用于 stdout
,另一个用于 stderr
。
运行 cargo run --example custom_section
显示了这些部分是如何包含在输出中的
只有 Stderr:
部分实际上被包含。由于 cat
命令失败,所以 stdout 最终为空,并在最终报告中被跳过。这给我们提供了一个简短且简洁的错误报告,确切地说明了尝试了什么以及它如何失败。
将多个错误聚合到一个报告中
对于批处理任务运行程序或解析器之类的程序,返回具有多个来源的错误并不罕见。当前版本的错误特性并不很好地支持此用例,尽管正在进行改进。
然而,目前可以通过在错误特性之外组合错误来解决此问题。color-eyre
通过 Section
特性支持其错误报告中的此类组合。
要查看如何聚合错误的示例,请参阅examples/multiple_errors.rs
。
为color-backtrace
设置自定义过滤器和其他配置的自定义配置
后迹和跨度迹的格式化打印实际上不是由color-eyre
提供的,而是来自其依赖项color-backtrace
和color-spantrace
。特别是,color-backtrace
比color-eyre
导出的功能更多,例如自定义颜色方案、panic钩子和自定义帧过滤器。当与color-eyre
结合使用时,自定义帧过滤器特别有用,因此为了启用它们的用法,我们提供了install
fn来设置带有自定义过滤器的自定义BacktracePrinter
。
要查看如何设置自定义过滤器的示例,请参阅examples/custom_filter.rs
。
许可协议
根据您的选择,受Apache License,版本 2.0或MIT许可证的许可。除非您明确声明,否则根据Apache-2.0许可证的定义,您有意提交的任何贡献,都应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~2.7–4.5MB
~90K SLoC