以下的三种条件会让recover返回nil:
- panic时指定参数为nil; (一般panic语句如 panic(“xxx failed”))
func Fn() {
defer func() {
if r := recover(); r != nil {
fmt.Println("this is recover")
}
}()
panic(nil) //指定参数为nil
}
func main() {
Fn()
}
- 当前协程没有发生panic;
- recover没有被defer方法直接调用,可以理解为,recover关键词必须和defer函数出现在同一函数中。
func coverFn() bool {
if err := recover(); err != nil {
fmt.Println("Recover success...")
return true
}
return false
}
func main() {
defer func() {
if coverFn() {
fmt.Println("this is recover")
}
}()
panic("test panic")
}
这里的 if coverFn() 永远为false。