Go語言panic和recover的用法實(shí)例
panic()
和 recover()
是 Go 語言中用于處理錯(cuò)誤的兩個(gè)重要函數(shù)。panic()
函數(shù)用于中止程序并引發(fā)panic,而 recover()
函數(shù)用于捕獲panic并恢復(fù)程序的執(zhí)行。
什么是panic和recover?
panic
panic()
函數(shù)用于中止程序并引發(fā)panic。panic()
函數(shù)可以接收一個(gè)參數(shù),該參數(shù)將作為panic的原因。- 當(dāng)發(fā)生panic時(shí),程序?qū)⑼V箞?zhí)行,并開始尋找最近的recover調(diào)用。
- 如果找不到recover調(diào)用,程序?qū)⒋蛴anic的原因并退出。
recover
recover()
函數(shù)用于捕獲panic并恢復(fù)程序的執(zhí)行。recover()
函數(shù)可以接收一個(gè)參數(shù),該參數(shù)將存儲(chǔ)panic的原因。- 如果在發(fā)生panic時(shí)調(diào)用了recover,程序?qū)⒗^續(xù)執(zhí)行,并且panic的原因?qū)⒈淮鎯?chǔ)在recover的第一個(gè)參數(shù)中。
func main() { defer func() { err := recover() if err != nil { fmt.Println("panic:", err) } }() panic("hello, panic!") }
panic 的傳播
panic 函數(shù)會(huì)向上傳播到調(diào)用它的 goroutine。如果 panic 函數(shù)沒有被捕獲,則會(huì)一直向上傳播,直到遇到 defer
語句中調(diào)用的 recover()
函數(shù),或者程序退出。
注意事項(xiàng)
跨協(xié)程失效
panic
和 recover
不能跨協(xié)程使用。這意味著在一個(gè)協(xié)程中發(fā)生的panic只能在同一個(gè)協(xié)程中通過 recover
捕獲。如果在一個(gè)協(xié)程中發(fā)生了panic,而在另一個(gè)協(xié)程中調(diào)用了 recover
,那么 recover
將無法捕獲panic。參考如下代碼:
func main() { defer println("in main") go func() { defer println("in goroutine") panic("") }() time.Sleep(1 * time.Second) }
失效的崩潰恢復(fù)
如果在一個(gè)defer函數(shù)中發(fā)生了panic,那么該defer函數(shù)后面的語句將不會(huì)被執(zhí)行。這意味著在defer函數(shù)中使用 recover
來捕獲panic是無效的。
func main(){ defer fmt.Println("main....") defer func() { err := recover() if err != nil { fmt.Println("panic:", err) } }() panic("hello, panic!") }
嵌套崩潰
嵌套崩潰是指在一個(gè) goroutine 中調(diào)用 panic()
函數(shù),然后在 defer
語句中再次調(diào)用 panic()
函數(shù)。在這種情況下,panic()
函數(shù)會(huì)從內(nèi)向外傳播,直到程序崩潰。嵌套崩潰可能會(huì)導(dǎo)致程序不可用,因此應(yīng)避免使用。
func multiplePanic() { defer fmt.Println("in defer") defer func() { defer func() { panic("panic 3") }() panic("panic 2") }() panic("panic 1") }
到此這篇關(guān)于Go語言panic和recover的用法實(shí)例的文章就介紹到這了,更多相關(guān)Go語言panic和recover內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go panic和recover函數(shù)使用細(xì)節(jié)深入探究
- Go中的 panic / recover 簡(jiǎn)介與實(shí)踐記錄
- 一文帶你掌握Golang中panic與recover的使用方法
- GoLang中panic與recover函數(shù)以及defer語句超詳細(xì)講解
- Golang中panic與recover的區(qū)別
- Golang異常處理之defer,panic,recover的使用詳解
- Golang 錯(cuò)誤捕獲Panic與Recover的使用
- 小學(xué)生也能看懂的Golang異常處理recover panic
- Go中recover與panic區(qū)別詳解
- go語言的panic和recover函數(shù)用法實(shí)例
- go語言異常panic和恢復(fù)recover用法實(shí)例
相關(guān)文章
詳解如何利用GORM實(shí)現(xiàn)MySQL事務(wù)
為了確保數(shù)據(jù)一致性,在項(xiàng)目中會(huì)經(jīng)常用到事務(wù)處理,對(duì)于MySQL事務(wù)相信大家應(yīng)該都不陌生。這篇文章主要總結(jié)一下在Go語言中Gorm是如何實(shí)現(xiàn)事務(wù)的;感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-09-09詳解如何使用unsafe標(biāo)準(zhǔn)庫突破Golang中的類型限制
在使用c語言編程時(shí),常常因?yàn)轭愋偷膯栴}大傷腦筋,而,golang提供了一些方式用于喜歡hack的用戶,下面我們就來講講如何使用unsafe標(biāo)準(zhǔn)庫突破Golang中的類型限制吧2024-03-03Golang 實(shí)現(xiàn)超大文件讀取的兩種方法
這篇文章主要介紹了Golang 實(shí)現(xiàn)超大文件讀取的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04