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

从 Go 1.13 开始,我们能够链接错误,打开它们并通过 和 检查链中的任何错误是否与任何预期的错误errors.Is()匹配errors.As()

要包装错误,您所要做的就是使用%w动词,fmt.Errorf()如下所示。

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

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


森栏
浏览 147回答 2
2回答

慕标琳琳

您可以创建一个新的错误类型,它包含其他错误,同时提供额外的结构化信息。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。

一只斗牛犬

错误是一个接口(满足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 myCustomErrorif errors.As(err, &v) {   // now v is parsed }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go