我们都知道panic和recover的配合使用。
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
panic(1)
}
但是,我想对recover做一个封装,如下。
func main() {
defer func() {
if err := MyRecover(); err != nil {
fmt.Println(err)
}
}()
panic(1)
}
func MyRecover() any {
fmt.Println("trace...")
return recover()
}
其实这样是无法捕获异常的。
又或者只是嵌套一层defer
func main() {
defer func() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
}()
panic(1)
}
或者直接调用
func main() {
defer recover()
panic(1)
}
依然是无法捕获的。
这是因为recover只能经过一层函数帧。比如我们简单的修改一下,就可以捕获到了。
func main() {
defer MyRecover()
panic(1)
}
再想,如果我们抛出的是 nil 异常会怎么样呢?
func main() {
defer func(){
if err := recover(); err != nil {
}
}()
panic(nil)
}
虽然捕获到的异常信息是 nil ,但是程序恢复了正常。