总之:Return nested/wrapped 个错误

anyhow: Return nested/wrapped errors

use anyhow::Context;

fancy_module::run()
.await
.with_context(|| {
    format!("An error has been found")
})?;

据我了解,当 run return 出现错误时,我们 return “已发现错误”。但是这个消息并没有真正的意义。我也想 return 错误 运行 returns。类似于 format!("An error has been found {}", e)。我如何获得 e return 由 run 编辑?

我可以用多行代码来做到这一点。通过获取 run 的结果,然后使用 match 语句。有更好的方法吗?

From what I understand, when run returns an error, we return "An error has been found".

不正确! context and with_context围绕底层错误值创建一个包装器以引入额外的上下文,但原始错误保留在其中!

一旦你尝试 displaying the error,你会看到这样的东西:

Error: An error has been found

Caused by:
    No such file or directory (os error 2)

(这也表明“已发现错误”对于创建额外的上下文来说是一个糟糕的词语选择。)

I would like to also return the error that run returns. Something like format!("An error has been found {}", e).

这在过去曾经是一个合理的设计决策,但当前的错误类型设计指南是反对在显示消息中包括源错误,除非该源错误在源错误链中也不可达。上下文方法 将错误放入源链中,因此不建议将该错误消息包含到顶级错误消息中。

How do I get e returned by run?

查看 chain 方法以遍历源错误链,从而使您能够窥视根本原因。尽管如此,无论如何,错误类型大多被设计为不透明的。如果您需要更好地自省错误的含义或更容易对错误进行模式匹配,请考虑使用结构错误类型而不是 anyhow::Errorsnafuthiserror 可以帮助您构建它们)。

另请参阅: