Go錯(cuò)誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法
前言
前面我們講過了error類型來處理一般的錯(cuò)誤,本文會(huì)描述使用panic函數(shù)和recover函數(shù)來處理比較極端的錯(cuò)誤。簡單來說,當(dāng)程序運(yùn)行時(shí)遇到無法處理的錯(cuò)誤或異常情況時(shí),會(huì)調(diào)用panic
函數(shù)引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤,此時(shí)程序會(huì)終止執(zhí)行并拋出錯(cuò)誤信息。為了避免程序崩潰,可以使用recover
函數(shù)來捕獲錯(cuò)誤,并進(jìn)行處理或恢復(fù)程序的執(zhí)行,通常recover
函數(shù)寫在defer
語句中。
panic函數(shù)
panic函數(shù)是內(nèi)置的一個(gè)函數(shù),他的結(jié)構(gòu)如下:
func panic(v interface{})
此函數(shù)接受一個(gè)接口類型的值,這個(gè)值通常是錯(cuò)誤的描述,調(diào)用次函數(shù)后,會(huì)引發(fā)異常,這將中止當(dāng)前的程序流程,并在堆棧中記錄當(dāng)前的異常信息。此函數(shù)可以被主動(dòng)調(diào)用,也可以在發(fā)生數(shù)組越界、空指針引用等情況下被動(dòng)調(diào)用。
我們將上篇文章的除法例子進(jìn)行小小的修改,使用panic進(jìn)行錯(cuò)誤處理:
package main import ( "fmt" ) func divide(a, b int) int{ if b == 0 { panic("division by zero") } return a / b } func main() { result := divide(10, 0) fmt.Println("the result is ",result) }
運(yùn)行后,程序直接退出了,報(bào)division by zero
錯(cuò)誤。
recover函數(shù)
有些時(shí)候,我們不希望panic函數(shù)直接粗暴的退出,這時(shí)候我們可以使用recover函數(shù)對pannic進(jìn)行捕獲,注意,recover函數(shù)只能寫在defer關(guān)鍵字之后哦!
recover也是內(nèi)置函數(shù),他的結(jié)構(gòu)如下:
func recover() interface{}
他能捕獲到的panic函數(shù)報(bào)出的錯(cuò)誤,并使用接口類型進(jìn)行返回。
我們使用recover對例子再次修改,讓程序可以繼續(xù)的運(yùn)行,而不是粗暴的退出,代碼如下:
package main import ( "fmt" ) func divide(a, b int) int{ defer func() { if err:=recover();err!=nil { fmt.Printf("runtime panic : %v\n", err) } }() if b == 0 { panic("division by zero") } return a / b } func main() { result := divide(10, 0) fmt.Println("the result is ",result) }
總結(jié)
本篇博客探討了如何使用 panic 和 recover 來處理 Go 語言中的異常。當(dāng)程序遇到無法處理的錯(cuò)誤時(shí),它可以使用 panic 函數(shù)引發(fā)異常,并使用 recover 函數(shù)結(jié)合defer關(guān)鍵詞從異常中恢復(fù)。
到此這篇關(guān)于Go錯(cuò)誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法的文章就介紹到這了,更多相關(guān)go異常捕獲panic 和 recover內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn)
本文主要介紹了Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04go-zero 應(yīng)對海量定時(shí)/延遲任務(wù)的技巧
這篇文章主要介紹了go-zero 如何應(yīng)對海量定時(shí)/延遲任務(wù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例
這篇文章主要介紹了golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04golang 執(zhí)行命令行的實(shí)現(xiàn)
本文主要介紹了golang 執(zhí)行命令行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08golang多次讀取http request body的問題分析
這篇文章主要給大家分析了golang多次讀取http request body的問題,文中通過代碼示例和圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01