Go语言如何实现多层级自定义错误类型的继承与属性预设
实现方案
第一步:定义FailedTo错误类型
通过结构体嵌入*CustomError继承原有能力,工厂函数自动添加Failed to前缀、默认状态码设为500。
import "fmt" // FailedTo 继承CustomError的所有能力,默认状态码500,错误信息自动带Failed to前缀 type FailedTo struct { *CustomError // 嵌入已有CustomError指针,实现类型兼容 } // NewFailedTo FailedTo类型工厂函数 // operate参数为具体操作描述,比如"create resource"、"query database" // err参数为原始被包装错误 func NewFailedTo(operate string, err error) *FailedTo { msg := fmt.Sprintf("Failed to %s", operate) return &FailedTo{ CustomError: NewCustomError(msg, 500, err), } }
第二步:定义FailedToCreateSomething错误类型
同样通过嵌入*FailedTo实现多层类型兼容,工厂函数完全匹配你给出的调用格式。
// FailedToCreateSomething 特定场景错误类型,继承FailedTo所有能力 type FailedToCreateSomething struct { *FailedTo // 嵌入FailedTo指针,实现多层类型兼容 } // FailedToCreateSomething 工厂函数,和示例调用方式完全匹配 func FailedToCreateSomething(err error) *FailedToCreateSomething { return &FailedToCreateSomething{ // 固定操作描述为"create something",符合类型语义 FailedTo: NewFailedTo("create something", err), } }
类型断言验证
你给出的示例代码返回的errCreateSomething可同时通过三种类型校验,用errors.As的校验示例如下:
import "errors" func createSomething() error { return FailedToCreateSomething(errors.New("File is busy")) } func main() { errCreateSomething := createSomething() // 校验是否为CustomError类型:匹配成功 var ce *CustomError if errors.As(errCreateSomething, &ce) { println("匹配CustomError成功,错误信息:", ce.Message) } // 校验是否为FailedTo类型:匹配成功 var ft *FailedTo if errors.As(errCreateSomething, &ft) { println("匹配FailedTo成功,状态码:", ft.StatusCode) } // 校验是否为FailedToCreateSomething类型:匹配成功 var ftcs *FailedToCreateSomething if errors.As(errCreateSomething, &ftcs) { println("匹配FailedToCreateSomething成功,原始错误:", ftcs.Err.Error()) } }
内容的提问来源于stack exchange,提问作者Thales P
相关产品推荐
相关产品推荐

