为了账号安全,请及时绑定邮箱和手机立即绑定

仅使用标准库,如何将错误包装在自定义错误中?

仅使用标准库,如何将错误包装在自定义错误中?

Go
森栏 2022-06-01 11:31:13
从 Go 1.13 开始,我们能够链接错误,打开它们并通过 和 检查链中的任何错误是否与任何预期的错误errors.Is()匹配errors.As()。要包装错误,您所要做的就是使用%w动词,fmt.Errorf()如下所示。fmt.Errorf("Custom message: %w", err)这很容易,它包含err在另一个带有附加消息的消息中。但是,假设我需要更多的上下文而不仅仅是一条消息。如何包装err自己的结构化自定义错误?仅使用 Go 1.13+ 标准库
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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


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,

    }

}

您需要实现Error和Unwrap接口才能使用 和 的新errors.Is功能errors.As。


查看完整回答
反对 回复 2022-06-01
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

错误是一个接口(满足error() string)因此您可以将另一种错误类型设为:


type myCustomError struct {

  Message    string

  StatusCode int

}


func (m myCustomError) error() string {

  return fmt.Sprintf("Code %d: \tMessage: %s", m.StatusCode, m.Message) 

}

现在您可以使用作为自定义错误抛出的错误


_, err := doStuff()

var v myCustomError

if errors.As(err, &v) {

   // now v is parsed 

}


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信