golang panic 函數(shù)用法示例詳解
在 Go 語(yǔ)言中,panic
和 recover
是用于處理運(yùn)行時(shí)異常的關(guān)鍵字。以下是它們的用法總結(jié)和示例:
1. panic 的作用
- 觸發(fā)條件:當(dāng)程序遇到無(wú)法恢復(fù)的嚴(yán)重錯(cuò)誤時(shí)(如不可預(yù)料的邏輯錯(cuò)誤、依賴項(xiàng)缺失等),
panic
會(huì)終止當(dāng)前函數(shù)的執(zhí)行,并逐層向上觸發(fā)defer
,最后若未被recover
捕獲,程序會(huì)崩潰。 - 適用場(chǎng)景:
- 初始化階段的關(guān)鍵資源缺失(如配置文件、數(shù)據(jù)庫(kù)連接)。
- 代碼邏輯中出現(xiàn)不可恢復(fù)的異常(如斷言失?。?/li>
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\") // 不會(huì)執(zhí)行 }
輸出:
Start
Recovered from panic: something bad happened
3. recover 的使用規(guī)則
- 必須與
defer
結(jié)合:recover
只能在defer
函數(shù)中生效。 - 僅在當(dāng)前 goroutine 有效:無(wú)法捕獲其他 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()\") // 不會(huì)執(zhí)行 }
4. 錯(cuò)誤處理建議
- 優(yōu)先返回
error
:常規(guī)錯(cuò)誤應(yīng)通過(guò)多返回值(如error
類型)處理。 - 謹(jǐn)慎使用
panic
:僅在嚴(yán)重錯(cuò)誤或不可恢復(fù)場(chǎng)景下使用(如程序啟動(dòng)失?。?。 - 在關(guān)鍵位置
recover
:例如在 goroutine 的入口或 HTTP 請(qǐng)求處理器中,防止程序崩潰。
Web 服務(wù)器示例:
func handleRequest() { defer func() { if err := recover(); err != nil { log.Println(\"Request failed:\", err) } }() // 處理請(qǐng)求邏輯(可能觸發(fā) panic) }
5. 常見(jiàn)錯(cuò)誤場(chǎng)景
- 未捕獲的 panic:若未在
defer
中調(diào)用recover
,程序會(huì)崩潰。 - 跨 goroutine panic:每個(gè) goroutine 需獨(dú)立處理自己的 panic。
總結(jié)
panic
:用于終止程序執(zhí)行并傳遞錯(cuò)誤信息。recover
:在defer
中捕獲 panic,恢復(fù)程序流程。- 最佳實(shí)踐:優(yōu)先使用錯(cuò)誤返回值,僅在必要時(shí)結(jié)合
panic
和recover
。
通過(guò)合理使用這兩個(gè)關(guān)鍵字,可以提升程序的健壯性,避免因未處理異常導(dǎo)致的崩潰。
到此這篇關(guān)于golang panic 函數(shù)用法的文章就介紹到這了,更多相關(guān)golang panic 函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)微信小程序商城后臺(tái)系統(tǒng)(moshopserver)
這篇文章主要介紹了golang實(shí)現(xiàn)微信小程序商城后臺(tái)系統(tǒng)(moshopserver),本文通過(guò)截圖實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02深入探究Go語(yǔ)言的錯(cuò)誤策略與異常機(jī)制
本文深入探討了Go語(yǔ)言的錯(cuò)誤策略與異常機(jī)制,主要介紹了錯(cuò)誤處理的重要性,以及Go語(yǔ)言中的錯(cuò)誤類型和處理函數(shù),此外還討論了Go語(yǔ)言的異常機(jī)制,包括panic和recover函數(shù)的使用,需要的朋友可以參考下2024-02-02Go語(yǔ)言使用GORM操作數(shù)據(jù)庫(kù)使用指南
GORM(全稱為Go?Object?Relational?Mapping)是一個(gè)在Go語(yǔ)言中使用的輕量級(jí)的對(duì)象關(guān)系映射(ORM)庫(kù),本文主要為大家介紹了GORM操作數(shù)據(jù)庫(kù)具體方法,需要的可以參考一下2023-05-05GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解
這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09