首页 > 解决方案 > 错误处理设计 - 当需要根据错误类型在函数堆栈顶部处理错误,但需要沿堆栈添加信息时

问题描述

我需要在 Go 中重构代码,以便传播到主函数的不同类型的错误将导致不同的操作来处理它们。在任何情况下,都应记录错误消息。

我通常只会有不同类型的错误,并让它们派生自基本错误类,每个都对应于我想要采取的一种操作。此方法不适用于此代码,因为错误不断被重写,以便为错误字符串添加更多上下文。

例如 -

func start_something(...)(...){
    var, err = get_something()
     if err != nil {
          return fmt.Errorf("unable to start something: %w", err.string())
     }
}

我可以在错误中添加魔术字符串,然后在 main.xml 中解析错误消息。这感觉太难看了。将不胜感激任何有关如何编写此内容的建议方向。尤其是对编写 Go 有一定经验的人来说,这可以指导我找到正确的 Go 方法。

谢谢,

标签: godesign-patternserror-handling

解决方案


用于fmt.Errorf("unable to start something: %w", err)包装错误。您可以通过实现错误包文档Unwrap() error中描述的方法来创建自己的错误包装器。

使用errors.As查找与目标类型匹配的包装错误链中的第一个错误。

使用errors.Is确定包装错误链中的任何错误是否与目标类型匹配。


推荐阅读