FHO Error
类型与 ffx_error
在子工具边界上,有一个由 ffx
库定义的错误类型,如下所示
一种向 ffx
工具指明错误是否是因某种原因导致的
是否应将其报告为 bug。
在旧版插件系统中,这通过使用 ffx_error
或
ffx_bail
宏,指示应将错误直接报告给
用户,系统会将任何其他详细信息复制到日志中。任何其他 anyhow
错误
被视为 BUG
,其中会显示一条大型警告以及有关在日志中查看位置的信息。
不过,这种方法仍然有效,并且新的错误类型会正确吸收这一错误
来自 anyhow
个错误的信息,但我们不建议
资源。当人们学会如何写作时,会让人感到困惑和不清楚
其他工具中的工具,但他们通常无法了解使用相应宏的原因
更改。
将错误转换为 fho::Error
与 anyhow
不同,fho 的错误类型不会尝试直接吸收任何错误,
您应改用 FfxContext
trait 中的方法来指明
处理错误的方式。
如果您希望系统将错误视为用户错误,可以使用 user_message
或 with_user_message
,以向其添加用户可见的上下文(同时保留
诊断的错误链):
process(filename).with_user_message(|| format!("Failed to process {filename}"))?;
如果您希望将其视为错误,因为它不应真正地 发生时,用户不太可能通过任何简单的操作来解决 :
do_thing().bug()?;
这就迫使我们有意识地认识到错误是如何呈现给别人的 用户。
何时使用何种错误类型
没有必要或者可能非常可取,没有必要将这种错误类型
整个代码库中。您可能会继续使用
在库代码和较低级别部分使用 anyhow
或最好使用 thiserror
工具界面然后,您可以将这些错误转换为与 ffx
兼容的错误。
在库代码周围 您可以决定如何显示错误。最好的做法是 浅层传递信息,并将需要的 以便您可以据此做出更明智的决策。
该流程是一个非常简单的示例:
let stuff = get_user_input().user_message("Your input made no sense!")?;
stuff.act_on_it().bug()?;