8 个版本
0.1.7 | 2023 年 9 月 1 日 |
---|---|
0.1.6 | 2023 年 8 月 23 日 |
#48 在 #line-numbers
每月 103 次下载
用于 wherr
9KB
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概念,请参阅我们的详细示例。
关于包组织结构的说明
wherr
被分成两个独立的包,因为Rust限制在一个包中混合普通函数和过程宏
wherr
:这是主库,提供Rust中错误处理的增强功能。wherr-macro
:包含为wherr
包专门设计的进程宏。
贡献
如果您有兴趣为wherr
做出贡献,请遵循标准的Rust社区指南,并在我们的仓库中提交PR。
许可协议
本项目采用MIT许可协议和Apache许可协议双许可。
依赖关系
~290–740KB
~18K SLoC