2个不稳定版本
0.2.0 | 2023年5月7日 |
---|---|
0.1.0 | 2022年8月20日 |
#675 in 调试
在 2 crate 中使用
12KB
105 行
logerr
无缝错误类型日志记录。
它做什么?
logerr
旨在使将错误日志记录作为 std::result::Result
的一部分变得简单且无阻碍。它提供了一个 trait,LoggableError
,该 trait 在多种常见的 Result
变体上实现。所有 trait 函数都具有一个特殊属性,即它们 未修改地传递 Result
类型。
这样,常规错误处理就不会受到任何阻碍,并且可以在处理错误的同时进行日志记录。
如何使用它
一旦您有一个支持错误类型的 Result
,您只需这样做
use anyhow::{anyhow, Context};
use logerr::LoggableError; // Must include to get access to trait functions
fn main() {
Err(anyhow!("an error occured"))
.context("this is just a demo")
.to_stderr() // <-- Magic!
.unwrap()
}
有一些特性标志控制日志记录的行为。默认情况下,LoggableError
使用对所有实现 Error
的错误类型通用的实现,并使用它们的 Display
实现打印错误,如果实现了 Error::source()
,则打印错误链。
如果您想使用更多高级功能,或为您的自定义错误类型(包括自定义日志记录)添加特殊实现,请禁用默认功能并自行实现该 trait。
特性标志
特性兼容性矩阵
以下是一个矩阵表示,显示可以安全组合的特性。一个 X
表示特性可以组合。
log | anyhow | generic | |
---|---|---|---|
log | X | X | |
anyhow | X | ||
generic | X |
选择要使用的特性
我只想要记录错误!
在这种情况下,默认特性(log
和 generic
)可能非常适合您
我希望完全使用自己的错误格式化!
目前这仅适用于你或你的代码拥有的错误类型(由于孤儿规则)。在这种情况下,放弃所有默认功能,自己实现 LoggableError
特性。如果你需要灵感,可以查看源代码。
我在所有的错误处理中都使用 anyhow!
使用 anyhow
功能标志,你就可以开始了。
log
引入了 log crate,并为 to_log
添加了默认实现,将错误打印到 log::error!
。
注意:记录的消息将不包含调用该模块的信息。这是 Rust 语言的缺点,一旦 #87417 合并后,将得到修复。
anyhow
引入了 anyhow crate,并为 anyhow::Result
(即 Result<_, anyhow::Error
)添加了特定实现,使用默认的 anyhow
调试格式打印整个错误链。你的应用程序必须使用 anyhow::Result
类型才能正常工作。
generic
为所有实现 Error
特性的错误类型添加了 LoggableError
特性的泛型实现。结果看起来像这样
ERROR: an error occured
because: something bad happened
because: file doesn't exist
根本原因是最后打印的错误。
依赖项
~120KB