【发布时间】:2021-11-06 07:32:15
【问题描述】:
我正在包装错误(以添加上下文),然后区分两个错误。这是我目前用于测试的场景。 (函数是否正确识别错误?)我的问题是如何减少冗长。
我有两个函数会产生不同的错误:
func a() error {
return errors.New("a")
}
func b() error {
return errors.New("b")
}
它们都由传播错误的第三个函数调用。
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")
}
}
到目前为止,一切都很好。不幸的是,要实现WrapA 和WrapB,我需要很多代码:
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
}
在其他语言中,我将创建一个 Wrap 结构并让 WrapA 和 WrapB 从 Wrap 继承。但我没有看到在 Go 中执行此操作的方法。
关于如何减少混乱的任何想法?
去游乐场https://play.golang.org/p/ApzHC_miNyV
编辑:
看到 jub0bs 的回答后,我想澄清一下:
a() 和 b() 都是我无法控制的回调。他们可能会返回各种错误。这就是我包装它们的原因。
【问题讨论】:
-
go 中没有子类型。没有类层次结构。
-
当然,我只是想知道我是否错过了一种更 Go-esque 的方法来完成同样的任务。