日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Golang?錯誤捕獲Panic與Recover的使用_Golang

作者:頭禿貓輕王 ? 更新時間: 2022-05-24 編程語言

一、Golang 錯誤是什么?

對于Go語言(Golang)的錯誤是通過返回值的方式,來強(qiáng)迫調(diào)用者對錯誤進(jìn)行處理,要么你通過 _ 忽略,要么你處理。對于這種設(shè)計方式,我們通常需要會寫大量的 if err != nil 判斷。我們可以通過方法來做到校驗。

這類代碼非常的多,盡管工程中 error 大部分都是nil,也就是沒有任何錯誤,但是非nil的時候,就意味著錯誤就出現(xiàn)了。
在Go語言中,使用多值返回來返回錯誤。Go中可以拋出一個 panic 的異常,然后在 defe r中通過 recover 捕獲這個異常,然后再正常處理。

二、錯誤校驗

1.方法

當(dāng)存在錯誤時,我們通過方法來判斷是否 panic:

func Panic(err error) {

?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
}

2.判斷錯誤

代碼如下(示例):

若不采用方法

for _, c := range []string{"1", "2"} {

?? ??? ?atoi, err := strconv.Atoi(c)
?? ??? ?if err != nil {
?? ??? ??? ?return
?? ??? ?}
?? ??? ?fmt.Println(atoi)
?? ?}

若采用方法

但此時 panic 還需要我們額外處理來將錯誤捕獲

?? ?for _, c := range []string{"1", "2"} {

?? ??? ?atoi, err := strconv.Atoi(c)
?? ??? ?Panic(err)
?? ??? ?fmt.Println(atoi)
?? ?}

三、錯誤捕獲

1.方法

當(dāng)存在錯誤時,我們通過recover來判斷 panic 是否產(chǎn)生:

func RecoverError() {

?? ?if err := recover(); err != nil {
?? ??? ?//輸出panic信息
?? ??? ?fmt.Println(err)

?? ??? ?//輸出堆棧信息
?? ??? ?fmt.Println(string(debug.Stack()))
?? ?}
}

2.defer 的使用

由于我們的捕獲必須在錯誤產(chǎn)生之后,那我們就必須保證捕獲方法調(diào)用在錯誤處理方法之后,也就是通過 defer 來控制方法的最后調(diào)用 :

func main() {
?? ?// 當(dāng)使用defer 時,將會在程序內(nèi)方法結(jié)算后,
?? ?// 依照后進(jìn)先出的方法執(zhí)行defer內(nèi)方法
?? ?// 此時就能保證 捕獲程序一定能捕獲到錯誤
?? ?defer RecoverError()
?? ?for _, c := range []string{"1", "2"} {

?? ??? ?atoi, err := strconv.Atoi(c)
?? ??? ?Panic(err)

?? ??? ?fmt.Println(atoi)
?? ?}

}

總結(jié)

通過以上來簡單熟悉Golang 與其他語言截然不同的錯誤處理形式,由于其他語言開發(fā)者經(jīng)常將異常與控制結(jié)構(gòu)混在一起,這會很容易使得代碼變得混亂。開發(fā)者也很容易濫用異常,甚至一個小小的錯誤都拋出一個異常。這在Golang中不被允許,Go語言也就不支持傳統(tǒng)的 try…catch…finally 這種異常,通過新的 defer panic recover 來進(jìn)行錯誤處理。

原文鏈接:https://blog.csdn.net/moer0/article/details/123593492

欄目分類
最近更新