在 Go 中处理多级抽象中的错误
当错误反复向上传递时,多级抽象中的错误处理可能会变得很麻烦链,导致重复日志和丢失上下文。
注释错误
注释错误是推荐的方法。它涉及创建一个新的错误值来包装原始错误,从而提供额外的上下文。 Errors 包为此目的提供了 Wrap() 和 Cause() 函数。
在给定的示例中:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
ObjectThreeHiggerLevel 使用附加上下文注释来自 ObjectTwoHigherLevel 的错误。
“延长”错误
另一种方法是使用 fmt.Errorf()“扩展”错误。虽然它不提供错误解包功能,但它允许您创建带有添加上下文的自定义错误消息:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return fmt.Errorf("Object3 illegal state: %v", err) } return nil }
委派或处理错误
处理错误时,决定是处理它们还是将它们委托给更高级别很重要。如果未处理错误,则应使用添加的上下文来委托它,以避免丢失信息或导致重复日志。
在示例中:
// ObjectThreeHiggerLevel func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { if err := oTh.HandleError(err); err != nil { // Error handling failed, log and return original error return errors.Wrapf(err, "Object3 failed to handle error: %v", err) } return nil } return nil }
在此示例中,HandleError() 尝试来处理错误。如果失败,原始错误将被包装并返回。
避免重复日志
使用上下文注释或扩展错误可确保当错误在堆栈上传播时,它包含有意义的日志记录和错误处理所需的所有信息。这可以防止重复日志并有助于了解问题的根本原因。
以上是如何有效处理Go多级抽象中的错误?的详细内容。更多信息请关注PHP中文网其他相关文章!