溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言中panic和recover的作用是什么

發(fā)布時(shí)間:2021-07-06 15:53:17 來源:億速云 閱讀:337 作者:Leah 欄目:大數(shù)據(jù)

Go語言中panic和recover的作用是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1. panic使用介紹

panic一旦觸發(fā)之后,會(huì)按照下面的順序來做處理:

1)panic開始的地方啟動(dòng)終止程序操作。

2)調(diào)用當(dāng)前觸發(fā)panic函數(shù)里面的defer函數(shù)。

3)返回該函數(shù)的調(diào)用方,當(dāng)作異常返回來處理,所以這一步也會(huì)調(diào)用調(diào)用方函數(shù)的defer,一直到?jīng)]有調(diào)用方為止。

4)打印panic的信息。

5)打印堆棧跟蹤信息,也就是我們看到的函數(shù)調(diào)用關(guān)系。

6)終止程序。

例子:

Go語言中panic和recover的作用是什么

結(jié)果分析:通過輸出結(jié)果我們可以看出,1)2調(diào)用了panic開始了panic的操作, 3出不在執(zhí)行,故沒有打印。2)執(zhí)行testPanic中的defer函數(shù),輸出了"testPanic exit!" 。3) 接著,返回到調(diào)用方main函數(shù),當(dāng)作異常終止,調(diào)用main中的defer函數(shù),打印"main exit!",main中的6處代碼也被跳過執(zhí)行。4) 打印panic觸發(fā)時(shí)的錯(cuò)誤信息"trigger panic!" 。5)打印panic的調(diào)用堆棧信息,這里是從觸發(fā)panic的點(diǎn)開始的,一層層往上調(diào)用。6)退出程序。

2. recover使用介紹

recover是go提供的一個(gè)用來截獲panic信息,重新獲取協(xié)程控制的函數(shù)。它的使用,有兩點(diǎn)需要注意,1)recover只能在defer函數(shù)中使用。2)recover的使用必須與觸發(fā)panic的協(xié)程是同一個(gè)協(xié)程才行。

例子1,同一個(gè)協(xié)程中:

Go語言中panic和recover的作用是什么

結(jié)果分析:通過調(diào)用recover之后的結(jié)果來看,panic被1處的recover成功截獲,只是3處到代碼沒有執(zhí)行而已,對(duì)于調(diào)用testPanic的main函數(shù)后續(xù)代碼都被執(zhí)行了,"main end!"信息也被打印出來了。

例子2,panic和recover在不同協(xié)程中,不能恢復(fù)

Go語言中panic和recover的作用是什么

結(jié)果分析:通過輸出結(jié)果可以看出,就算我們在4處調(diào)用了rcover,但是panic也沒有被截獲,原因就是panic在子協(xié)程中,而recover在主協(xié)程中,recover不能跨協(xié)程截獲panic信息。

3.補(bǔ)充知識(shí):

  對(duì)于panic顯示的函數(shù)堆棧調(diào)用關(guān)系,debug.PrintStack()也可以做到,它就是用來打印函數(shù)的堆棧調(diào)用關(guān)系的, 例子如下所示:

Go語言中panic和recover的作用是什么

下面是panic和recover兩個(gè)函數(shù)的解釋說明:https://golang.org/src/builtin/builtin.go?h=panic#L232

Go語言中panic和recover的作用是什么


看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI