
异常处理
go的异常
如果代码有异常的话,一般在defer中写一些处理逻辑。
recover() 的核心作用是:阻止 panic 向上传播,让程序继续执行而不是崩溃退出!!!!!
首先,要明确的是,defer 一定会执行的。那么为什么还要用recover()捕获异常呢?原因就是让程序恢复正常状态,从而不影响后面的流程
go
func main() {
defer func() {
log.Println("Recovered from panic:") // 这里只是打印,没有真正恢复
}()
fmt.Println("1111")
divisor := 0
i := 1 / divisor // 运行时 panic
fmt.Println(i)
fmt.Println("3333")
}
结果
text
1111
2025/09/26 21:54:00 Recovered from panic:
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.main()
E:/go_ws/demo/main.go:22 +0x6a
要让程序从 panic 中恢复并继续执行,需要在 defer 中调用 recover():
go
func main() {
defer func() {
if r := recover(); r != nil {
log.Printf("Recovered from panic: %v", r)
// 程序会继续执行,不会退出
}
}()
fmt.Println("1111")
// 使用变量,避免编译时计算
divisor := 0
i := 1 / divisor // 运行时 panic
fmt.Println(i)
fmt.Println("3333")
}
结果
text
1111
2025/09/26 21:59:42 Recovered from panic: runtime error: integer divide by zero
最终示例
go
func main() {
fmt.Println(111)
main2()
fmt.Println(222)
}
func main2() {
fmt.Println("程序开始")
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到 panic: %v\n", r)
fmt.Println("程序已恢复,继续执行...")
}
//fmt.Println("异常。。。。")
}()
fmt.Println("执行正常操作...")
// 模拟 panic
panic("发生严重错误!")
fmt.Println("这行不会执行") // panic 后的代码不会执行
}
//111
//程序开始
//执行正常操作...
//捕获到 panic: 发生严重错误!
//程序已恢复,继续执行...
//222