/ Go 语言 recover 避免程序宕机详解 /
Go 语言中可以通过 recover 机制来防止程序崩溃,本文将通过完整的示例详细介绍 recover 的用法。本文主要内容
- recover 基本用法
- 错误处理
- 重新 panic
- 多层 recover
- 与错误处理结合
1
一、recover 基本用法
recover 可以捕获 panic,示例:
func main() { defer func() { fmt.Println("Recover: ", recover()) // 捕获panic信息 }() panic("Crash") // 触发panic }
输出:
Recover: Crash
defer 延迟执行 recover,捕获到 panic 参数。
2
二、错误处理
可以根据 recover 结果进行错误处理:
func main() { defer func() { r := recover() if r != nil { fmt.Println("Recovered from panic: ", r) } }() panic(123) }
输出:
Recovered from panic: 123
根据 recover 的参数进行处理。
3
三、重新 panic
也可以在 recover 后重新 panic:
func main() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered: ", r) panic(r) // 重新panic } }() panic(123) }
输出:
Recovered: 123 panic: 123
根据情况选择是否重新 panic。
4
四、多层 recover
通过多层 defer 可以多次 recover:
func main() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered 1: ", r) } }() defer func() { if r := recover(); r != nil { fmt.Println("Recovered 2: ", r) } }() panic(123) }
输出:
Recovered 2: 123 Recovered 1: 123
多层 defer 实现多次 recover。
5
五、与错误处理结合
recover 要与错误处理结合使用:
if err := dangerous(); err != nil { // 错误处理 } func dangerous() (err error) { defer func() { if r := recover(); r != nil { err = r.(error) // 转换为error类型 } }() // 可能引起panic的代码 return }
常规错误用 err,不可恢复错误用 panic+recover。
6
六、总结
recover 机制可以有效防止 Go 程序完全崩溃,与错误处理配合使用可以提高程序健壮性。
综上所述,详细介绍了如何通过 recover 机制避免 Go 程序崩溃,可以帮助大家更好地处理 Go 程序中的 panic 问题。