Go的错误处理defer、recover、panic
错误处理
在 Go 语言中,defer、recover 和 panic 是用于处理错误和异常的关键机制。它们的作用和区别如下:
1. panic
- 作用:
panic用于触发一个运行时错误,导致程序立即停止当前函数的执行,并开始逐层向上回溯调用栈,执行每个函数的defer语句。 - 使用场景:通常用于处理不可恢复的错误,例如程序逻辑错误、非法输入等。
- 示例:
输出:func main() { panic("something went wrong") // 触发 panic fmt.Println("This will not be printed") }panic: something went wrong
2. recover
- 作用:
recover用于捕获panic并恢复程序的正常执行。它只能在defer函数中生效。 - 使用场景:用于捕获并处理
panic,避免程序崩溃。 - 示例:
输出:func main() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() panic("something went wrong") // 触发 panic fmt.Println("This will not be printed") }Recovered from panic: something went wrong
3. defer
- 作用:
defer用于延迟执行一个函数调用,通常用于释放资源或执行清理操作。无论函数是否发生panic,defer语句都会在函数返回前执行。如果有多个defer,后被defer的语句先执行,也就是逆序执行。 - 使用场景:用于资源管理(如关闭文件、释放锁等)或确保某些操作在函数结束时执行。
- 示例:
输出:func main() { defer fmt.Println("This will be printed last 1") defer fmt.Println("This will be printed last 2") fmt.Println("This will be printed first") }This will be printed first This will be printed last 2 This will be printed last 1
4. 三者的区别
| 特性 | panic |
recover |
defer |
|---|---|---|---|
| 作用 | 触发运行时错误,终止程序执行 | 捕获 panic,恢复程序执行 |
延迟执行函数调用 |
| 使用场景 | 处理不可恢复的错误 | 捕获并处理 panic |
资源管理、清理操作 |
| 执行顺序 | 立即终止当前函数,逐层回溯调用栈 | 必须在 defer 函数中生效 |
在函数返回前执行 |
| 是否影响程序 | 导致程序崩溃(除非被 recover 捕获) |
恢复程序正常执行 | 不影响程序执行,仅延迟操作 |
5. 综合示例
以下是一个结合 defer、recover 和 panic 的示例:
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
fmt.Println("Start")
riskyFunction()
fmt.Println("End") // 这行不会被执行,因为 panic 导致函数提前返回
}
func riskyFunction() {
defer fmt.Println("Defer in riskyFunction") // 这行会在 panic 后执行
panic("something went wrong") // 触发 panic
}
输出:
Start
Defer in riskyFunction
Recovered from panic: something went wrong
6. 总结
panic:用于触发运行时错误,终止程序执行。recover:用于捕获panic,恢复程序正常执行。defer:用于延迟执行函数调用,通常用于资源管理或清理操作。
三者通常结合使用,defer 确保资源释放,recover 捕获 panic 避免程序崩溃,panic 用于处理不可恢复的错误。

浙公网安备 33010602011771号