#file-line #error #line-numbers #debugging #error-handling #enhance #details

wherr

使用 #[wherr] 宏增强 Rust 错误,添加文件和行详细信息,以便更清晰的调试

8 个版本

0.1.7 2023 年 9 月 1 日
0.1.6 2023 年 8 月 23 日

#924 in Rust 模式

Download history 284/week @ 2024-04-21 24/week @ 2024-04-28 19/week @ 2024-05-05 17/week @ 2024-05-12 18/week @ 2024-05-19 45/week @ 2024-05-26 15/week @ 2024-06-02 20/week @ 2024-06-09 23/week @ 2024-06-16 27/week @ 2024-06-23 99/week @ 2024-06-30 14/week @ 2024-07-07 48/week @ 2024-07-14 49/week @ 2024-07-21 46/week @ 2024-07-28 10/week @ 2024-08-04

每月 156 次下载

MIT/Apache

11KB
63

wherr

version documentation License

在 Hacker News 上讨论 wherr

通过将文件和行号详细信息添加到错误中,增强 Rust 的 ? 操作符,简化调试过程。

功能

  • 📁 将文件和行号添加到使用 ? 传播的错误中。
  • 🧩 与 Rust 的现有错误处理无缝集成。
  • 📍 通过定位错误来源来帮助更快地定位和修复错误。
  • 🚀 通过 anyhow 功能标志支持 anyhow 错误处理。

为什么使用 wherr

在 Rust 中使用 ? 操作符时,传播的错误通常不提供错误发生的 位置 文件和行号详细信息。尤其是在嵌套函数调用和多个潜在错误点的情况下,这种缺少详细信息可能会导致调试困难。

wherr 解决了这个问题,为您提供了精确的错误位置数据。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
wherr = "0.1"

对于 anyhow 支持

[dependencies]
wherr = { version = "0.1", features = ["anyhow"] }

快速入门

通过简单地使用 #[wherr] 标注您的函数,使用 ? 传播的错误也将包含文件和行号。

  1. 标准用法:使用 #[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
  1. 使用 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》被分成两个独立的包。

  1. wherr:这是提供增强错误处理功能的Rust主库。
  2. wherr-macro:包含专为《wherr》包设计的进程宏。

贡献

如果您有兴趣为《wherr》贡献力量,请遵循标准的Rust社区指南,并在我们的仓库中提交PR。

许可证

本项目采用MIT许可证Apache许可证双重授权。

依赖关系

~295–790KB
~19K SLoC