FFX 子工具中的错误

FHO Error 类型与 ffx_error

在子工具边界上,有一个由 ffx 库定义的错误类型,如下所示 一种向 ffx 工具指明错误是否是因某种原因导致的 是否应将其报告为 bug。

在旧版插件系统中,这通过使用 ffx_errorffx_bail 宏,指示应将错误直接报告给 用户,系统会将任何其他详细信息复制到日志中。任何其他 anyhow 错误 被视为 BUG,其中会显示一条大型警告以及有关在日志中查看位置的信息。

不过,这种方法仍然有效,并且新的错误类型会正确吸收这一错误 来自 anyhow 个错误的信息,但我们不建议 资源。当人们学会如何写作时,会让人感到困惑和不清楚 其他工具中的工具,但他们通常无法了解使用相应宏的原因 更改。

将错误转换为 fho::Error

anyhow 不同,fho 的错误类型不会尝试直接吸收任何错误, 您应改用 FfxContext trait 中的方法来指明 处理错误的方式。

如果您希望系统将错误视为用户错误,可以使用 user_messagewith_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()?;