假设我调用函数f().unwrap(),它调用函数g。g函数返回 Package 在Result中的Error,f传播此错误。然后我得到消息,线程在我调用f().unwrap()的行处死机,我想知道的是返回错误的位置。即g返回错误的位置。这将提供更多信息,有没有办法实现这一点?
f().unwrap()
g
Result
Error
f
dhxwm5r41#
你可以这样做,但你必须收集和附加的信息自己:使用anyhow,您可以使用context方法向错误添加上下文。
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) }
oo7oh9g92#
如果返回anyhow::Error,并打开anyhow的backtrace功能,则可以从错误中检索回溯(如果将环境变量RUST_BACKTRACE或RUST_LIB_BACKTRACE设置为1):
anyhow::Error
anyhow
backtrace
RUST_BACKTRACE
RUST_LIB_BACKTRACE
1
let error: anyhow::Error; eprintln!("{}", error.backtrace());
2条答案
按热度按时间dhxwm5r41#
你可以这样做,但你必须收集和附加的信息自己:
使用anyhow,您可以使用
context
方法向错误添加上下文。或者您可以将错误 Package 在您自己的包含信息的错误类型中。
oo7oh9g92#
如果返回
anyhow::Error
,并打开anyhow
的backtrace
功能,则可以从错误中检索回溯(如果将环境变量RUST_BACKTRACE
或RUST_LIB_BACKTRACE
设置为1
):