最近写代码遇到recover不能捕获panic的坑,错误代码如下:
package test1 import ( "fmt" "testing" ) func rec1() { err := recover() if err != nil{ fmt.Println("err: ", err) } } func TestRecover(t *testing.T) { // 错误的捕获方式 defer func (){ fmt.Println("做一些其他业务逻辑的处理......") rec1() }() panic("TestRecover raises error!") }
运行完结果程序崩溃了。
查了一些资料,recover()让程序恢复,必须在延迟函数中执行。换言之,recover()仅在延迟函数中有效。
但是像上面这样将recover函数放在一个延迟的匿名函数中就不行。
试着换一种方式执行问题就解决了:
package test1 import ( "fmt" "testing" ) func rec1() { err := recover() if err != nil{ fmt.Println("err: ", err) } } func TestRecover(t *testing.T) { // 正确的捕获方式 defer rec1() panic("TestRecover raises error!") }
上面这种捕获方式是可以的。
关于Golang中defer、panic与recover相关说明的参考:https://huoyingwhw.com/golangGuide/%E5%9F%BA%E7%A1%80/4/#82-defer
原文:https://www.cnblogs.com/paulwhw/p/14519106.html