Golang 中 panic 和 recover 的实现原理如下:
一、panic
panic用于在运行时终止当前Goroutine的执行,抛出一个异常:
panic(error)
调用panic后:
- 当前Goroutine停止执行
- 执行defer语句
- 如果defer语句里也有panic,向上传播
- 否则退出Goroutine
二、 recover
recover用于捕获panic。只能在defer调用中使用:
if err := recover(); err != nil {
// 处理panic
}
三、原理
panic和recover的原理是:
- 当Goroutine抛出panic后,会从当前frame开始,向上回溯寻找recover
- 第一个遇到的defer frame,如果有recover,就捕获该panic
- 否则继续向上回溯,传播给caller
- 如果到达mainframe还没有找到,程序崩溃
四、注意
- recover只能捕获当前Goroutine的panic
- 调用一次recover后,后续的panic不起作用
总的来说,panic和recover的原理是:
- panic用于当前Goroutine抛出异常
- recover用于在defer中捕获异常
- panic会向上回溯寻找recover
- 第一个recover捕获panic后返回
- 否则panic继续向上传播
- recover只能捕获当前Goroutine的panic
- 调用一次recover后后续panic不起作用
通过这个机制,实现了异常捕获和传播的功能。帮助解决Goroutine间的错误处理问题。