Error handling 如何跟踪错误结果的原因?

Error handling 如何跟踪错误结果的原因?,error-handling,rust,Error Handling,Rust,在编写使用Result类型的代码时,用户和开发人员可能需要不同的行为 在编写能够优雅地处理错误的应用程序时,最好使用Result 在开发过程中,您可能希望“捕获”错误,以查看哪一行代码创建了错误,或者在创建Err值时获取堆栈跟踪 如果您犯了一个独特的错误,搜索它并不困难,但是如果错误来自标准库,那么这个错误可能是非常普遍的 例如,如果不手动将每个file.read()?更改为file.read().unwrap(),就不可能知道哪个read命令导致了意外的文件结尾 是否有一种方便的方法从结果

在编写使用
Result
类型的代码时,用户和开发人员可能需要不同的行为

  • 在编写能够优雅地处理错误的应用程序时,最好使用
    Result
  • 在开发过程中,您可能希望“捕获”错误,以查看哪一行代码创建了错误,或者在创建
    Err
    值时获取堆栈跟踪
如果您犯了一个独特的错误,搜索它并不困难,但是如果错误来自标准库,那么这个错误可能是非常普遍的

例如,如果不手动将每个
file.read()?
更改为
file.read().unwrap(),就不可能知道哪个
read
命令导致了意外的文件结尾

是否有一种方便的方法从
结果中获取堆栈跟踪

一个弱但可行的解决方案可能是制作一个宏来读取,
read\u in\u release\u unwrap\u in\u debug!(文件、数据)
。。。但这感觉很尴尬



我有一个文件读取器,有许多
读取
调用,其中一个失败。我不知道是哪个。在运行时,我希望将结果推还给调用者。对于调试,我希望失败的读取调用停止或以某种方式让我知道其行号。

结果本身没有任何回溯信息,但您可以将其添加到自定义错误类型中

示例为您生成错误类型,当设置了
RUST\u backtrace
环境变量时,您可以免费获得回溯生成

您也可以直接使用该库并自己动手。

如果您使用,您可以免费获得该库!关键是您需要每晚使用并启用一个环境变量:

RUST_BACKTRACE=1 cargo +nightly run

,及。看起来对于稳定前是否需要在无标准状态下工作或类似情况存在一些分歧。

我用板条箱解决了这一要求,而板条箱也很好

使用
easy error
中定义的返回类型,然后使用方法转换其他
结果
类型

最重要的是用行号将信息传递给
上下文
方法

使用easy_错误::{Result,resultText};
使用std::path::PathBuf;
fn测试_open()->结果{
让mut p=PathBuf::from(env!(“货物舱单目录”);
p、 推送(“resources/test/songs.json”);
文件::打开(p).context(格式!(“{}:{}”,文件!(),行!())?;
好(())
}
避免键入
格式!(“{}:{}”,file!(),line!())
始终定义一个宏:

#[宏导出]
宏规则!代码位置{
() => {
格式!(“{}:{}”,文件!(),行!())
};
}
最后的代码是:

File::open(p).context(code_loc!())?;