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

wherr-macro

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

8 个版本

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

#48#line-numbers

Download history 79/week @ 2024-03-10 27/week @ 2024-03-17 30/week @ 2024-03-24 65/week @ 2024-03-31 73/week @ 2024-04-07 38/week @ 2024-04-14 290/week @ 2024-04-21 22/week @ 2024-04-28 19/week @ 2024-05-05 19/week @ 2024-05-12 16/week @ 2024-05-19 44/week @ 2024-05-26 15/week @ 2024-06-02 29/week @ 2024-06-09 28/week @ 2024-06-16 27/week @ 2024-06-23

每月 103 次下载
用于 wherr

MIT/Apache

9KB

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概念,请参阅我们的详细示例

关于包组织结构的说明

wherr被分成两个独立的包,因为Rust限制在一个包中混合普通函数和过程宏

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

贡献

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

许可协议

本项目采用MIT许可协议Apache许可协议双许可。

依赖关系

~290–740KB
~18K SLoC