panic 是 Go 语言中的一种运行时错误处理机制,用于处理程序中的异常情况。
基本含义
panic 会:
- 立即停止当前函数的执行
- 开始执行 defer 函数(如果有的话)
- 向上传播到调用栈,逐层执行 defer
- 如果到达 main 函数,程序会崩溃并退出
语法
使用场景
panic 通常用于:
- 不可恢复的错误(如数组越界、空指针解引用)
- 程序逻辑错误
- 初始化失败
- 手动触发 panic(不推荐)
示例
1. 自动触发的 panic
- func main() {
- // 数组越界会触发 panic
- arr := []int{1, 2, 3}
- fmt.Println(arr[10]) // panic: runtime error: index out of range
- }
复制代码 2. 手动触发 panic
- func divide(a, b int) int {
- if b == 0 {
- panic("除数不能为零")
- }
- return a / b
- }
复制代码 3. defer 与 panic
- func main() {
- defer fmt.Println("程序结束")
- defer fmt.Println("清理资源")
-
- panic("发生错误")
-
- fmt.Println("这行不会执行")
- }
- // 输出:
- // 清理资源
- // 程序结束
- // panic: 发生错误
复制代码 recover 函数
recover 用于捕获 panic,只能在 defer 函数中使用:- func handlePanic() {
- defer func() {
- if r := recover(); r != nil {
- fmt.Println("捕获到 panic:", r)
- }
- }()
-
- panic("测试 panic")
- }
- func main() {
- handlePanic()
- fmt.Println("程序继续运行")
- }
复制代码 panic vs log.Fatal
特性paniclog.Fatal执行 defer✅ 会执行❌ 不会执行可恢复✅ 可用 recover❌ 不可恢复程序退出会退出会退出错误信息打印堆栈信息只打印错误信息最佳实践
- 避免手动使用 panic,除非是真正的不可恢复错误
- 使用 error 返回值处理可预期的错误
- 在 defer 中使用 recover 来优雅处理 panic
- 在 main 函数或 init 函数中使用 panic 处理初始化错误
- func main() {
- defer func() {
- if r := recover(); r != nil {
- log.Printf("程序异常退出: %v", r)
- }
- }()
-
- // 初始化代码
- if err := initialize(); err != nil {
- panic("初始化失败: " + err.Error())
- }
-
- // 正常程序逻辑
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |