只使用标准库,如何在自定义错误中包裹错误?

从Go 1.13开始,我们就可以将错误连锁起来,解开它们并检查连锁中的错误是否与任何预期的错误相匹配,通过 errors.Is()errors.As().

要包装一个错误,你只需使用 %w 带动词 fmt.Errorf() 像下面这样。

fmt.Errorf("Custom message: %w", err)

这很简单,它包装了 err 在另一个附加的信息。但是,假设我需要一些更多的上下文,而不仅仅是一个消息。我如何将 err 在我自己的,结构化的,自定义的错误?仅使用Go 1.13+标准库。

解决方案:

你可以创建一个新的错误类型,在提供额外的结构化信息的同时包装其他错误。

type MyError struct {
    Inner error
    // Provide any additional fields that you need.
    Message string
    AdditionalContext string 
}

// Error is mark the struct as an error.
func (e *MyError) Error() string {
    return fmt.Sprintf("error caused due to %v; message: %v; additional context: %v", e.Inner, e.Message, e.AdditionalContext)
}

// Unwrap is used to make it work with errors.Is, errors.As.
func (e *MyError) Unwrap() error {
    // Return the inner error.
    return e.Inner
}

// WrapWithMyError to easily create a new error which wraps the given error.
func WrapWithMyError(err error, message string, additionalContext string) error {
    return &MyError {
        Inner: err,
        Message: message,
        AdditionalContext: additionalContext,
    }
}

你需要实现 ErrorUnwrap 的新功能。errors.Iserrors.As.

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在现有的ionic应用中整合SSO?

2022-9-9 4:02:20

未分类

HIVE SubQuery表达式指的是Parent和SubQuery表达式。

2022-9-9 4:13:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索