我想在Go中创建分层错误。我们可以在Go中实现吗?例如,我有以下两个错误。
type Error1 struct { reason string cause error } func (error1 Error1) Error() string { if error1.cause == nil || error1.cause.Error() == "" { return fmt.Sprintf("[ERROR]: %s\n", error1.reason) } else { return fmt.Sprintf("[ERROR]: %s\nCaused By: %s\n", error1.reason, error1.cause) } } type Error2 struct { reason string cause error } func (error2 Error2) Error() string { if error2.cause == nil || error2.cause.Error() == "" { return fmt.Sprintf("[ERROR]: %s\n", error2.reason) } else { return fmt.Sprintf("[ERROR]: %s\nCause: %s", error2.reason, error2.cause) } }
我想要一个CommonError包含两个子类型Error1和的错误类型Error1,以便执行以下操作。
CommonError
Error1
func printType(param error) { switch t := param.(type) { case CommonError: fmt.Println("Error1 or Error 2 found") default: fmt.Println(t, " belongs to an unidentified type") } }
有办法实现吗?
编辑:
在类型切换中,我们可以使用多个错误,如下所示: case Error1, Error2:但是,当我遇到大量错误时,或者当我需要对模块内部的错误进行抽象时,这种方法将不是最好的方法。
case Error1, Error2:
您可以在中列出多个类型case,这样便可以完成您想做的事情:
case
switch t := param.(type) { case Error1, Error2: fmt.Println("Error1 or Error 2 found") default: fmt.Println(t, " belongs to an unidentified type") }
测试它:
printType(Error1{}) printType(Error2{}) printType(errors.New("other"))
输出(在Go Playground上尝试):
Error1 or Error 2 found Error1 or Error 2 found other belongs to an unidentified type
如果要对错误进行“分组”,另一种解决方案是创建“标记”接口:
type CommonError interface { CommonError() }
这Error1与Error2必须实现:
Error2
func (Error1) CommonError() {} func (Error2) CommonError() {}
然后您可以执行以下操作:
switch t := param.(type) { case CommonError: fmt.Println("Error1 or Error 2 found") default: fmt.Println(t, " belongs to an unidentified type") }
用相同的方法测试,输出是相同的。在Go Playground上尝试一下。
如果您想将CommonErrors 限制为“ true”错误,请同时嵌入error接口:
error
type CommonError interface { error CommonError() }