#anyhow #context #trace #location #source #macro #stack

anyhow_trace

宏,将源位置作为上下文添加到anyhow错误中

4个版本

0.1.3 2024年3月24日
0.1.2 2024年3月21日
0.1.1 2024年3月21日
0.1.0 2024年3月21日

#1412 in 进程宏

Download history 34/week @ 2024-04-08 59/week @ 2024-04-15 112/week @ 2024-04-22 81/week @ 2024-04-29 14/week @ 2024-05-06 30/week @ 2024-05-13 95/week @ 2024-05-20 58/week @ 2024-05-27 82/week @ 2024-06-03 53/week @ 2024-06-10 54/week @ 2024-06-17 51/week @ 2024-06-24 35/week @ 2024-07-01 143/week @ 2024-07-08 72/week @ 2024-07-15 57/week @ 2024-07-22

313 每月下载次数
用于 12 个crate (3 直接)

MIT 许可证

6KB
75 代码行

此宏将try表达式重写为调用 anyhow::Context::with_context,该调用将try表达式的源位置作为上下文添加到错误中。

这创建了一个类似于回溯的东西,但实际上是错误传播的路径。这可能比使用anyhow的回溯功能更可取,因为它不依赖于栈展开或编译进调试符号。

以下是一个示例

use anyhow_trace::anyhow_trace;
use anyhow::{bail, Result};

fn foo_err() -> Result<()> {
    bail!("this is foo error")
}

struct FooBar;

#[anyhow_trace]
impl FooBar {
    fn thing() -> Result<()> {
        fn im_inside() -> Result<()> {
            foo_err()?;
            Ok(())
        }
        im_inside()?;
        Ok(())
    }
}

#[anyhow_trace]
fn inner() -> Result<()> {
    FooBar::thing()?;
    Ok(())
}

#[anyhow_trace]
fn main() -> Result<()> {
    inner()?;
    Ok(())
}

这将打印以下内容

Error: main at examples/example.rs:30:5

Caused by:
    0: inner at examples/example.rs:24:5
    1: FooBar::thing at examples/example.rs:17:9
    2: FooBar::thing::im_inside at examples/example.rs:14:13
    3: this is foo error

依赖项

~260–700KB
~17K SLoC