8 个版本
0.1.7 | 2023 年 9 月 1 日 |
---|---|
0.1.6 | 2023 年 8 月 23 日 |
#924 in Rust 模式
每月 156 次下载
11KB
63 行
wherr
包
通过将文件和行号详细信息添加到错误中,增强 Rust 的 ?
操作符,简化调试过程。
功能
- 📁 将文件和行号添加到使用
?
传播的错误中。 - 🧩 与 Rust 的现有错误处理无缝集成。
- 📍 通过定位错误来源来帮助更快地定位和修复错误。
- 🚀 通过
anyhow
功能标志支持anyhow
错误处理。
为什么使用 wherr
?
在 Rust 中使用 ?
操作符时,传播的错误通常不提供错误发生的 位置 文件和行号详细信息。尤其是在嵌套函数调用和多个潜在错误点的情况下,这种缺少详细信息可能会导致调试困难。
wherr
解决了这个问题,为您提供了精确的错误位置数据。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
wherr = "0.1"
对于 anyhow
支持
[dependencies]
wherr = { version = "0.1", features = ["anyhow"] }
快速入门
通过简单地使用 #[wherr]
标注您的函数,使用 ?
传播的错误也将包含文件和行号。
- 标准用法:使用
#[wherr]
标注函数。
use wherr::wherr;
#[wherr]
fn concat_files(path1: &str, path2: &str) -> Result<String, Box<dyn std::error::Error>> {
let mut content1 = std::fs::read_to_string(path1)?;
let content2 = std::fs::read_to_string(path2)?;
content1.push_str(&content2);
Ok(content1)
}
运行提供的示例
cargo run --example with_wherr
这将突出显示 wherr
做出的差异。您的错误现在将指示问题确切发生的位置
error at wherr/examples/with_wherr.rs:5
- 使用
anyhow
:
确保您已如安装部分所示添加了 anyhow
功能。然后
use anyhow::{Context, Result};
use wherr::wherr;
#[wherr]
fn concat_files(path1: &str, path2: &str) -> Result<String> {
let mut content1 = std::fs::read_to_string(path1).with_context(|| format!("Failed to read {}", path1))?;
let content2 = std::fs::read_to_string(path2).with_context(|| format!("Failed to read {}", path2))?;
content1.push_str(&content2);
Ok(content1)
}
运行提供的示例
cargo run --features=anyhow --example anyhow
这将突出显示 wherr
做出的差异。您的错误现在将指示问题确切发生的位置
error at wherr/examples/anyhow.rs:6
幕后
《#[wherr]
》标记是一个proc_macro_attribute,允许在编译时进行代码转换。
当在带有《#[wherr]
》注解的函数中使用?
运算符传播错误时,宏会捕获错误发生的文件和行号。
本质上,函数
#[wherr]
fn add(s1: &str, s2: &str) -> Result<i64, Box<dyn std::error::Error>> {
...
let i1 = i64::from_str_radix(s1, radix)?;
...
}
... 被转换成
fn add(s1: &str, s2: &str) -> Result<i64, Box<dyn std::error::Error>> {
...
let i1 = wherr::wherrapper(i64::from_str_radix(s1, radix), file!(), line!())?;
...
}
魔法发生在wherrapper
内部。它会检查给定的结果,如果是错误,则将其包装在文件和行详细信息中。
使用方法和示例
深入了解《wherr
》解决的问题和涉及的Rust概念,请参阅我们的详细示例。
关于包组织的说明
由于Rust对同一包中混合普通函数和过程宏的限制,所以《wherr
》被分成两个独立的包。
wherr
:这是提供增强错误处理功能的Rust主库。wherr-macro
:包含专为《wherr
》包设计的进程宏。
贡献
如果您有兴趣为《wherr
》贡献力量,请遵循标准的Rust社区指南,并在我们的仓库中提交PR。
许可证
依赖关系
~295–790KB
~19K SLoC