先介绍几个错误的例子
例子1
func re() (err error) {
defer func() error {
if p := recover(); p != nil {
fmt.Println(13, p)
err := errors.New(fmt.Sprintf("defer %+v", p))
return err
}
return nil
}()
panic("panic err")
return err
}
func main() {
err := re()
fmt.Println("get", err)
}
打印 get nil
这里错误在于defer 重新定义了err,和外层的err不是一个,外层的还是nil。
例子2
func re() (err error) {
defer func() error {
if p := recover(); p != nil {
fmt.Println(13, p)
return errors.New(fmt.Sprintf("defer %+v", p))
}
return nil
}()
panic("panic err")
return err
}
func main() {
err := re()
fmt.Println("get", err)
}
这里打印的还是get nil,其实defer func 返回值是啥都没有用,我原以为这里的返回值格式要和外层统一,显然是错误的。
正确的写法
func re() (err error) {
defer func() {
if p := recover(); p != nil {
fmt.Println(13, p)
err = errors.New(fmt.Sprintf("defer %+v", p))
}
}()
panic("panic err")
return err
}
所以我遇到其实就是函数当中defer和变量的关系问题