Go里如何组合多个error
起因是这个:proposal: errors: add With(err, other error) error #52607
这其实在其他有异常的语言里是很常见也很容易实现的一个场景,例如Java的Throwable就可以用构造器进行嵌套,这样可以一层一层的getCause
然后instanceof
判断类型。
但Go里的fmt.Errorf
是无类型的,所以如果要错误嵌套,就必须在各个Error对象上自己实现嵌套的能力,这显然非常的麻烦,而且有些错误是库里的,并不好做这个改动。
但我们回顾下errors包的使用,主要判断方式就是Is
和As
两个,直接用Unwrap
的场景并不多,而且errors包的Is
和As
方法在实现上也会判断被比较对象是不是实现了这两个方法并返回true,所以自己简单写一个,把多个error给包起来,同时也实现Is
和As
方法进行逐个比较就完事,50行代码还是很简单的
代码贴在这里:https://gist.github.com/ayanamist/f988de9c073ca7d07a29820621bdaeb3