anic
?是 Go 語言中的一種運行時錯誤處理機制,用于處理程序中的異常情況。
基本含義
panic
?會:
-
立即停止當前函數的執行
-
開始執行 defer 函數(如果有的話)
-
向上傳播到調用棧,逐層執行 defer
-
如果到達 main 函數,程序會崩潰并退出
語法
panic(interface{})
使用場景
panic
?通常用于:
-
不可恢復的錯誤(如數組越界、空指針解引用)
-
程序邏輯錯誤
-
初始化失敗
-
手動觸發 panic(不推薦)
示例
1. 自動觸發的 panic
func main() {// 數組越界會觸發 panicarr := []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
最佳實踐
-
避免手動使用 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())}// 正常程序邏輯
}
文章轉載自:Lucas_coming
原文鏈接:go學習筆記:panic是什么含義 - Lucas_coming - 博客園
體驗地址:JNPF快速開發平臺