Golang 錯(cuò)誤捕獲Panic與Recover的使用
一、Golang 錯(cuò)誤是什么?
對于Go語言(Golang)的錯(cuò)誤是通過返回值的方式,來強(qiáng)迫調(diào)用者對錯(cuò)誤進(jìn)行處理,要么你通過 _ 忽略,要么你處理。對于這種設(shè)計(jì)方式,我們通常需要會(huì)寫大量的 if err != nil 判斷。我們可以通過方法來做到校驗(yàn)。
這類代碼非常的多,盡管工程中 error 大部分都是nil,也就是沒有任何錯(cuò)誤,但是非nil的時(shí)候,就意味著錯(cuò)誤就出現(xiàn)了。
在Go語言中,使用多值返回來返回錯(cuò)誤。Go中可以拋出一個(gè) panic 的異常,然后在 defe r中通過 recover 捕獲這個(gè)異常,然后再正常處理。
二、錯(cuò)誤校驗(yàn)
1.方法
當(dāng)存在錯(cuò)誤時(shí),我們通過方法來判斷是否 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 還需要我們額外處理來將錯(cuò)誤捕獲
?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?}
三、錯(cuò)誤捕獲
1.方法
當(dāng)存在錯(cuò)誤時(shí),我們通過recover來判斷 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ò)誤處理方法之后,也就是通過 defer 來控制方法的最后調(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é)
通過以上來簡單熟悉Golang 與其他語言截然不同的錯(cuò)誤處理形式,由于其他語言開發(fā)者經(jīng)常將異常與控制結(jié)構(gòu)混在一起,這會(huì)很容易使得代碼變得混亂。開發(fā)者也很容易濫用異常,甚至一個(gè)小小的錯(cuò)誤都拋出一個(gè)異常。這在Golang中不被允許,Go語言也就不支持傳統(tǒng)的 try…catch…finally 這種異常,通過新的 defer panic recover 來進(jìn)行錯(cuò)誤處理。
到此這篇關(guān)于Golang 錯(cuò)誤捕獲Panic與Recover的使用的文章就介紹到這了,更多相關(guān)Golang 錯(cuò)誤捕獲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過程
Go語言是Google的開源編程語言,廣泛應(yīng)用于云計(jì)算、分布式系統(tǒng)開發(fā)等領(lǐng)域,在Linux上也有大量的應(yīng)用場景,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-11-11Go?Singleflight導(dǎo)致死鎖問題解決分析
這篇文章主要為大家介紹了Go?Singleflight導(dǎo)致死鎖問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09go語言csrf庫使用實(shí)現(xiàn)原理示例解析
這篇文章主要為大家介紹了go語言csrf庫使用實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Go項(xiàng)目中添加生成時(shí)間與版本信息的方法
本文主要介紹了Go項(xiàng)目中添加生成時(shí)間與版本信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式
這篇文章主要介紹了Go?Error?嵌套到底是怎么實(shí)現(xiàn)的?大家都知道創(chuàng)建error有兩種方式分別是errors.new()另一種是fmt.errorf(),本文通過詳細(xì)例子給大家介紹,需要的朋友可以參考下2022-01-01Golang unsafe.Sizeof函數(shù)代碼示例使用解析
這篇文章主要為大家介紹了Golang unsafe.Sizeof函數(shù)代碼示例使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全?
這篇文章主要介紹了Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05