首先我们要知道panic只会触发当前 Goroutine 的延迟函数调用,我们可以通过如下所示的代码了解该现象:
package main
import (
"fmt"
"time"
)
func main() {
defer fmt.Println("main")
go func() {
defer fmt.Println("go func")
panic(" ")
}()
time.Sleep(time.Second)
}
当我们执行上面代码时,输出结果是:
通过输出结果,我们发现当发生panic时,它只会执行本协程的已注册的defer语句,而不会执行其他协程的defer语句。
这时我们就得用recover防止程序崩溃了
func main() {
defer fmt.Println("main")
go func() {
defer func() {
recover()
}()//注意recover得另写在函数中
defer fmt.Println("go func")
panic(" ")
}()
time.Sleep(time.Second)
}
输出结果如下


本文介绍了Golang中panic和recover的工作原理。通过实例演示了panic仅触发当前协程的defer调用,以及如何使用recover来捕获并处理panic,避免程序崩溃。
1716

被折叠的 条评论
为什么被折叠?



