我正在包装错误(添加上下文),然后区分两个错误。这是我目前用于测试的方案。(函数是否正确识别错误?我的问题是我如何减少冗长。
我有两个创建不同错误的函数:
func a() error {
return errors.New("a")
}
func b() error {
return errors.New("b")
}
它们都由传播erorr的第三个函数调用。
func doStuff() error {
err := a()
if err != nil {
return WrapA{err}
}
err = b()
if err != nil {
return WrapB{err}
}
return nil
}
在我的主要功能中,我区分了这两个错误。
func main() {
fmt.Println("Hello, playground")
err := doStuff()
switch err.(type) {
case WrapA:
fmt.Println("error from doing a")
case WrapB:
fmt.Println("error from doing b")
case nil:
fmt.Println("nil")
default:
fmt.Println("unknown")
}
}
目前为止,一切都好。不幸的是,要实现 和 ,我需要大量的代码:WrapAWrapB
type WrapA struct {
wrappedError error
}
func (e WrapA) Error() string {
return e.wrappedError.Error()
}
func (e WrapA) Unwrap() error {
return e.wrappedError
}
type WrapB struct {
wrappedError error
}
func (e WrapB) Error() string {
return e.wrappedError.Error()
}
func (e WrapB) Unwrap() error {
return e.wrappedError
}
在其他语言中,我会创建一个单一的结构,并让和继承自。但是我看不出有什么办法可以在Go中做到这一点。WrapWrapAWrapBWrap
关于如何减少混乱的任何想法?
围棋游乐场 https://play.golang.org/p/ApzHC_miNyV
编辑:在看到jub0bs的答案后,我想澄清:两者都是我无法控制的回调。它们可能会返回各种错误。这就是我包装它们的原因。a()b()
杨魅力
jeck猫
忽然笑
相关分类