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。
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
}
- 2 回答
- 0 关注
- 146 浏览
添加回答
举报