go 中recover捕获异常
recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果.
重要的事再说一遍:仅当在一个defer函数中被完成时,调用recover()才生效。
我们来一段错误的代码:
package main import "fmt" func main() { recover() // 无任何作用 panic("停止运行") recover() // 不会执行到 fmt.Println("结束") }
输出:
panic: 停止运行 goroutine 1 [running]:exit status 2
修改下,正确的代码:
package main import "fmt" func main() { defer func() { fmt.Println("捕获到异常:", recover()) }() panic("手动抛出异常") }
输出:
捕获到异常: 手动抛出异常
重要的事再说一遍:recover()的调用仅当它在defer函数中被直接调用时才有效。
继续来看一段错误的代码:
package main import "fmt" func doRecover() { fmt.Println("捕获到异常 =>", recover()) //输出: 捕获到异常 => <nil> } func main() { defer func() { doRecover() //注意:这里间接使用函数,在函数中调用了recover()函数, // panic 没有恢复,没有捕获到错误信息 }() panic("手动抛出异常") }
输出:
捕获到异常 => <nil> panic: 手动抛出异常 goroutine 1 [running]: main.main() exit status 2
总结:panic配合recover使用,recover要在defer函数中直接调用才生效。
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。