go error handling
这篇文章是我学习董哥发布的 错误处理 文章的总结,好记性不如烂笔头,避坑啦!
通常情况下打印的错误信息是不包含堆栈的。
package main |
但是在很多情况下没有堆栈信息是很难定位问题的,除非是 panic 了,但是业务逻辑的代码不能直接 panic 可能会直接导致服务崩溃。
官方方法 %w
还是上面那个例子:
func readFile() error { |
github.com/pkg/errors
%s print the error. If the error has a Cause it will be |
errors.Wrap
package main |
使用 errors.Wrap 可以告诉我们堆栈信息,以及报错内容,还有一点需要注意的是:
在调用 errors.Wrap() 时,最好判断一下 err 是不是 nil,之前在群里时候就有一个哥们遇到了这个问题,类型断言失败了,err 是 nil,然后进行了 wrap 操作,wrap 中判断 err 是 nil 会直接返回 nil,导致后续代码执行的时候拿到了一个 nil pointer。下图是他当时的场景。
董哥在文章中有提到这一点,自己现在还没遇到,既然有人已经在上边踩过坑了,需要引起注意!
还有一点需要注意的就是,不要过多使用 errors.Wrap 这样会输出重复的堆栈信息,可以试试下面这段代码:
func readFile() error { |
error 级联问题
这个是没接触过的问题,但是或多或少听说过 interface 赋值的问题(抓个时间把 interface 好好看看),在 Go 中,error 其实就是一个 interface。
// The error built-in interface type is the conventional interface for |
完整代码如下:
package main |
答案就是:An interface value is equal to nil
only if both its value and dynamic type are nil
. **接口类型的值只有在 type 和 value 都是空的时候才是 nil,这里我们调用 Call2() 函数后,nil 有了具体的类型,这才导致了后续判断的时候出现奇怪的现象。
本文标题:go error handling
文章作者:bqyang
发布时间:2022-06-07
最后更新:2023-04-13
原始链接:https://bqyang.top/2022/language/golang/go-errors/
版权声明:The author owns the copyright, please indicate the source reproduced.