获取Rust中返回错误的行号和文件路径

wbgh16ku  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(232)

假设我调用函数f().unwrap(),它调用函数g。g函数返回 Package 在Result中的Errorf传播此错误。然后我得到消息,线程在我调用f().unwrap()的行处死机,我想知道的是返回错误的位置。即g返回错误的位置。这将提供更多信息,有没有办法实现这一点?

dhxwm5r4

dhxwm5r41#

你可以这样做,但你必须收集和附加的信息自己:
使用anyhow,您可以使用context方法向错误添加上下文。

fn main() {
    f().unwrap();
}

fn f() -> Result<(), anyhow::Error> {
    g().map_err(|e| e.context(format!("at {}:{}:{}", file!(), line!(), column!())))?;
    Err(anyhow::anyhow!("some other error"))
}

fn g() -> Result<(), anyhow::Error> {
    Err(anyhow::anyhow!("oh noes"))
}

或者您可以将错误 Package 在您自己的包含信息的错误类型中。

fn main() {
    f().unwrap();
}

#[derive(Debug)]
struct Error {
    file: &'static str,
    line: u32,
    column: u32,
    error: GError,
}

#[derive(Debug)]
struct GError;

fn f() -> Result<(), Error> {
    g().map_err(|e| Error {
        file: file!(),
        line: line!(),
        column: column!(),
        error: e,
    })
}

fn g() -> Result<(), GError> {
    Err(GError)
}
oo7oh9g9

oo7oh9g92#

如果返回anyhow::Error,并打开anyhowbacktrace功能,则可以从错误中检索回溯(如果将环境变量RUST_BACKTRACERUST_LIB_BACKTRACE设置为1):

let error: anyhow::Error;
eprintln!("{}", error.backtrace());

相关问题