golang panic 函數(shù)用法示例詳解
更新時間:2025年03月01日 15:49:26 作者:學會了沒
在Go語言中,panic用于觸發(fā)不可恢復的錯誤,終止函數(shù)執(zhí)行并逐層向上觸發(fā)defer,最終若未被recover捕獲,程序會崩潰,recover用于在defer函數(shù)中捕獲panic,恢復程序流程,建議優(yōu)先返回error,僅在嚴重錯誤或不可恢復場景下使用panic,并在關鍵位置recover,感興趣的朋友一起看看吧
在 Go 語言中,panic 和 recover 是用于處理運行時異常的關鍵字。以下是它們的用法總結(jié)和示例:
1. panic 的作用
- 觸發(fā)條件:當程序遇到無法恢復的嚴重錯誤時(如不可預料的邏輯錯誤、依賴項缺失等),
panic會終止當前函數(shù)的執(zhí)行,并逐層向上觸發(fā)defer,最后若未被recover捕獲,程序會崩潰。 - 適用場景:
- 初始化階段的關鍵資源缺失(如配置文件、數(shù)據(jù)庫連接)。
- 代碼邏輯中出現(xiàn)不可恢復的異常(如斷言失?。?。
2. 基本用法
package main
import \"fmt\"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(\"Recovered from panic:\", r)
}
}()
fmt.Println(\"Start\")
panic(\"something bad happened\") // 觸發(fā) panic
fmt.Println(\"End\") // 不會執(zhí)行
}輸出:
Start
Recovered from panic: something bad happened
3. recover 的使用規(guī)則
- 必須與
defer結(jié)合:recover只能在defer函數(shù)中生效。 - 僅在當前 goroutine 有效:無法捕獲其他 goroutine 的 panic。
func mayPanic() {
panic(\"a problem occurred\")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(\"Recovered. Error:\", r)
}
}()
mayPanic() // 觸發(fā) panic
fmt.Println(\"After mayPanic()\") // 不會執(zhí)行
}4. 錯誤處理建議
- 優(yōu)先返回
error:常規(guī)錯誤應通過多返回值(如error類型)處理。 - 謹慎使用
panic:僅在嚴重錯誤或不可恢復場景下使用(如程序啟動失?。?/li> - 在關鍵位置
recover:例如在 goroutine 的入口或 HTTP 請求處理器中,防止程序崩潰。
Web 服務器示例:
func handleRequest() {
defer func() {
if err := recover(); err != nil {
log.Println(\"Request failed:\", err)
}
}()
// 處理請求邏輯(可能觸發(fā) panic)
}5. 常見錯誤場景
- 未捕獲的 panic:若未在
defer中調(diào)用recover,程序會崩潰。 - 跨 goroutine panic:每個 goroutine 需獨立處理自己的 panic。
總結(jié)
panic:用于終止程序執(zhí)行并傳遞錯誤信息。recover:在defer中捕獲 panic,恢復程序流程。- 最佳實踐:優(yōu)先使用錯誤返回值,僅在必要時結(jié)合
panic和recover。
通過合理使用這兩個關鍵字,可以提升程序的健壯性,避免因未處理異常導致的崩潰。
到此這篇關于golang panic 函數(shù)用法的文章就介紹到這了,更多相關golang panic 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang TCP網(wǎng)絡編程的具體實現(xiàn)
go語言是一門功能強大的編程語言,它提供了眾多的網(wǎng)絡編程庫,其中包括tcp/ip,本文主要介紹了Golang TCP網(wǎng)絡編程的具體實現(xiàn),具有一定的參考價值,感興趣的可以來了解一下2024-06-06

