Golang 錯(cuò)誤捕獲Panic與Recover的使用
一、Golang 錯(cuò)誤是什么?
對(duì)于Go語(yǔ)言(Golang)的錯(cuò)誤是通過(guò)返回值的方式,來(lái)強(qiáng)迫調(diào)用者對(duì)錯(cuò)誤進(jìn)行處理,要么你通過(guò) _ 忽略,要么你處理。對(duì)于這種設(shè)計(jì)方式,我們通常需要會(huì)寫(xiě)大量的 if err != nil 判斷。我們可以通過(guò)方法來(lái)做到校驗(yàn)。
這類代碼非常的多,盡管工程中 error 大部分都是nil,也就是沒(méi)有任何錯(cuò)誤,但是非nil的時(shí)候,就意味著錯(cuò)誤就出現(xiàn)了。
在Go語(yǔ)言中,使用多值返回來(lái)返回錯(cuò)誤。Go中可以拋出一個(gè) panic 的異常,然后在 defe r中通過(guò) recover 捕獲這個(gè)異常,然后再正常處理。
二、錯(cuò)誤校驗(yàn)
1.方法
當(dāng)存在錯(cuò)誤時(shí),我們通過(guò)方法來(lái)判斷是否 panic:
func Panic(err error) { ?? ?if err != nil { ?? ??? ?panic(err) ?? ?} }
2.判斷錯(cuò)誤
代碼如下(示例):
若不采用方法
for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?if err != nil { ?? ??? ??? ?return ?? ??? ?} ?? ??? ?fmt.Println(atoi) ?? ?}
若采用方法
但此時(shí) panic 還需要我們額外處理來(lái)將錯(cuò)誤捕獲
?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?}
三、錯(cuò)誤捕獲
1.方法
當(dāng)存在錯(cuò)誤時(shí),我們通過(guò)recover來(lái)判斷 panic 是否產(chǎn)生:
func RecoverError() { ?? ?if err := recover(); err != nil { ?? ??? ?//輸出panic信息 ?? ??? ?fmt.Println(err) ?? ??? ?//輸出堆棧信息 ?? ??? ?fmt.Println(string(debug.Stack())) ?? ?} }
2.defer 的使用
由于我們的捕獲必須在錯(cuò)誤產(chǎn)生之后,那我們就必須保證捕獲方法調(diào)用在錯(cuò)誤處理方法之后,也就是通過(guò) defer 來(lái)控制方法的最后調(diào)用 :
func main() { ?? ?// 當(dāng)使用defer 時(shí),將會(huì)在程序內(nèi)方法結(jié)算后, ?? ?// 依照后進(jìn)先出的方法執(zhí)行defer內(nèi)方法 ?? ?// 此時(shí)就能保證 捕獲程序一定能捕獲到錯(cuò)誤 ?? ?defer RecoverError() ?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?} }
總結(jié)
通過(guò)以上來(lái)簡(jiǎn)單熟悉Golang 與其他語(yǔ)言截然不同的錯(cuò)誤處理形式,由于其他語(yǔ)言開(kāi)發(fā)者經(jīng)常將異常與控制結(jié)構(gòu)混在一起,這會(huì)很容易使得代碼變得混亂。開(kāi)發(fā)者也很容易濫用異常,甚至一個(gè)小小的錯(cuò)誤都拋出一個(gè)異常。這在Golang中不被允許,Go語(yǔ)言也就不支持傳統(tǒng)的 try…catch…finally 這種異常,通過(guò)新的 defer panic recover 來(lái)進(jìn)行錯(cuò)誤處理。
到此這篇關(guān)于Golang 錯(cuò)誤捕獲Panic與Recover的使用的文章就介紹到這了,更多相關(guān)Golang 錯(cuò)誤捕獲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之前綴樹(shù)Trie
這篇文章主要介紹了go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之前綴樹(shù)Trie,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容介紹,具有一定得參考價(jià)值,需要的小伙伴可以參考一下2022-05-05Go語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)的基本使用教程
輸入輸出在任何一門(mén)語(yǔ)言中都必須提供的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)的基本使用,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)詳解
在Go語(yǔ)言中函數(shù)可是一等的(first-class)公民,函數(shù)類型也是一等的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包
本文主要介紹了GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08go語(yǔ)言beego框架jwt身份認(rèn)證實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go語(yǔ)言beego框架jwt身份認(rèn)證實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04