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ò)誤、依賴(lài)項(xiàng)缺失等),
panic
會(huì)終止當(dāng)前函數(shù)的執(zhí)行,并逐層向上觸發(fā)defer
,最后若未被recover
捕獲,程序會(huì)崩潰。 - 適用場(chǎng)景:
- 初始化階段的關(guān)鍵資源缺失(如配置文件、數(shù)據(jù)庫(kù)連接)。
- 代碼邏輯中出現(xiàn)不可恢復(fù)的異常(如斷言失?。?。
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
類(lèi)型)處理。 - 謹(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 fasthttp踩坑經(jīng)驗(yàn)
本文主要介紹了golang fasthttp踩坑經(jīng)驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Go語(yǔ)言輕量級(jí)線(xiàn)程Goroutine用法實(shí)例
這篇文章主要介紹了Go語(yǔ)言輕量級(jí)線(xiàn)程Goroutine用法,實(shí)例分析了goroutine使用技巧,需要的朋友可以參考下2015-02-02Go中字符串處理?fmt.Sprintf與string.Builder的區(qū)別對(duì)比分析
在Go語(yǔ)言中,我們通常會(huì)遇到兩種主要的方式來(lái)處理和操作字符串:使用fmt.Sprintf函數(shù)和string.Builder類(lèi)型,本文給大家介紹它們?cè)谛阅芎陀梅ㄉ嫌幸恍╆P(guān)鍵區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-11-11淺談Golang中創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器的方法
這篇文章主要介紹了淺談Golang中創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器的方法,golang中的net/http包對(duì)網(wǎng)絡(luò)的支持非常好,這樣會(huì)讓我們比較容易的建立起一個(gè)相對(duì)簡(jiǎn)單的服務(wù)器,有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06使用Go語(yǔ)言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解
在這篇文章中,我們將介紹如何使用Go語(yǔ)言編寫(xiě)代碼來(lái)實(shí)現(xiàn)Yaml編碼和解碼,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下2023-11-11Go語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線(xiàn)、下劃線(xiàn)轉(zhuǎn)駝峰的實(shí)現(xiàn)
這篇文章主要介紹了Go語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線(xiàn)、下劃線(xiàn)轉(zhuǎn)駝峰的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06