Go語言異常處理error、panic、recover的使用
異常處理
Go 語言引入了一個關(guān)于錯誤處理的標(biāo)準(zhǔn)模式,即 error 接口,它是 Go 語言內(nèi)建的接口類型,該接口的定義如下:
package errors func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s }
- 通過fmt包進(jìn)行使用errorf接口
- 通過自帶的errors包進(jìn)行調(diào)用
常用在我們對檢測程序是否正常
panic
在通常情況下,向程序使用方報告錯誤狀態(tài)的方式可以是返回一個額外的 error 類型值。
但是,當(dāng)遇到不可恢復(fù)的錯誤狀態(tài)的時候,如數(shù)組訪問越界、空指針引用等,這些運(yùn)行時錯誤會引起 painc 異常。在一般情況下,我們不使用 panic 函數(shù)來報告普通的錯誤,而應(yīng)該只把它作為報告致命錯誤的一種方式。當(dāng)某些不應(yīng)該發(fā)生的場景發(fā)生時,就調(diào)用panic。
一般而言,當(dāng) panic異常發(fā)生時,程序會中斷運(yùn)行,并立即執(zhí)行在該 goroutine(可以先理解成線程,在中被延遲的函數(shù)(defer機(jī)制)。隨后,程序崩潰并輸出日志信息。日志信息包括 panic value 和函數(shù)調(diào)用的堆棧跟蹤信息。
不是所有的 panic 異常都來自運(yùn)行時,直接調(diào)用內(nèi)置的 panic 函數(shù)也會引發(fā) panic 異常: panic函數(shù)接受任何值作為參數(shù)。
func panic(v interface{})
直接調(diào)用panic函數(shù)
直接調(diào)用內(nèi)置的 panic 函數(shù)也會引發(fā) panic 異常。
數(shù)組越界導(dǎo)致panic
recover
運(yùn)行時 panc 異常一旦被引發(fā)就會導(dǎo)致程序崩潰。Go語言為我們提供了專用于“攔截”運(yùn)行時 panic 的內(nèi)建所數(shù)–recover。它可以是當(dāng)前的程序從運(yùn)行時 panic 的狀態(tài)中恢復(fù)并重新獲得流程控制權(quán)。
fune recover()interface{}
注意:recover只有在defer調(diào)用的所數(shù)中有效。
如果調(diào)用了內(nèi)置函數(shù)recover,并且定義該 defer 語句的函數(shù)發(fā)生了 panic 異常,recover 會使程序從 panic 中恢復(fù),并返回 panic value。導(dǎo)致panic 異常的函數(shù)不會繼續(xù)運(yùn)行,但能正常返回。在未發(fā)生 panic 時調(diào)用recover,recover 會返回 nil。
到此這篇關(guān)于Go語言異常處理error、panic、recover的使用的文章就介紹到這了,更多相關(guān)Go語言異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang通過反射設(shè)置結(jié)構(gòu)體變量的值
這篇文章主要介紹了golang通過反射設(shè)置結(jié)構(gòu)體變量的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go切片導(dǎo)致rand.Shuffle產(chǎn)生重復(fù)數(shù)據(jù)的原因與解決方案
在 Go 語言的實(shí)際開發(fā)中,切片(slice)是一種非常靈活的數(shù)據(jù)結(jié)構(gòu),然而,由于其底層數(shù)據(jù)共享的特性,在某些情況下可能會導(dǎo)致意想不到的 Bug,本文將詳細(xì)分析 rand.Shuffle 之后,切片中的數(shù)據(jù)出現(xiàn)重復(fù)的問題,探討其根本原因,并給出最佳解決方案,需要的朋友可以參考下2025-02-02go+redis實(shí)現(xiàn)消息隊列發(fā)布與訂閱的詳細(xì)過程
這篇文章主要介紹了go+redis實(shí)現(xiàn)消息隊列發(fā)布與訂閱,redis做消息隊列的缺點(diǎn):沒有持久化,一旦消息沒有人消費(fèi),積累到一定程度后就會丟失,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09深入了解Go的interface{}底層原理實(shí)現(xiàn)
本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06golang項(xiàng)目如何上線部署到Linu服務(wù)器(方法詳解)
這篇文章主要介紹了golang項(xiàng)目如何上線部署到Linu服務(wù)器,本文通過兩種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Golang動態(tài)數(shù)組的實(shí)現(xiàn)示例
動態(tài)數(shù)組能自動調(diào)整大小,與靜態(tài)數(shù)組不同,其大小不固定,可根據(jù)需求變化,實(shí)現(xiàn)通常依賴于數(shù)據(jù)結(jié)構(gòu)如鏈表或數(shù)組加額外信息,本文就來介紹一下Golang動態(tài)數(shù)組的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-10-10