首页 > 后端开发 > Golang > 如何有效处理Go多级抽象中的错误?

如何有效处理Go多级抽象中的错误?

DDD
发布: 2024-12-22 20:16:10
原创
447 人浏览过

How Can I Effectively Handle Errors in Go's Multi-Level Abstractions?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板