您好,登錄后才能下訂單哦!
Go語言中panic和recover的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
panic一旦觸發之后,會按照下面的順序來做處理:
1)panic開始的地方啟動終止程序操作。
2)調用當前觸發panic函數里面的defer函數。
3)返回該函數的調用方,當作異常返回來處理,所以這一步也會調用調用方函數的defer,一直到沒有調用方為止。
4)打印panic的信息。
5)打印堆棧跟蹤信息,也就是我們看到的函數調用關系。
6)終止程序。
例子:
結果分析:通過輸出結果我們可以看出,1)2調用了panic開始了panic的操作, 3出不在執行,故沒有打印。2)執行testPanic中的defer函數,輸出了"testPanic exit!" 。3) 接著,返回到調用方main函數,當作異常終止,調用main中的defer函數,打印"main exit!",main中的6處代碼也被跳過執行。4) 打印panic觸發時的錯誤信息"trigger panic!" 。5)打印panic的調用堆棧信息,這里是從觸發panic的點開始的,一層層往上調用。6)退出程序。
recover是go提供的一個用來截獲panic信息,重新獲取協程控制的函數。它的使用,有兩點需要注意,1)recover只能在defer函數中使用。2)recover的使用必須與觸發panic的協程是同一個協程才行。
例子1,同一個協程中:
結果分析:通過調用recover之后的結果來看,panic被1處的recover成功截獲,只是3處到代碼沒有執行而已,對于調用testPanic的main函數后續代碼都被執行了,"main end!"信息也被打印出來了。
例子2,panic和recover在不同協程中,不能恢復
結果分析:通過輸出結果可以看出,就算我們在4處調用了rcover,但是panic也沒有被截獲,原因就是panic在子協程中,而recover在主協程中,recover不能跨協程截獲panic信息。
對于panic顯示的函數堆棧調用關系,debug.PrintStack()也可以做到,它就是用來打印函數的堆棧調用關系的, 例子如下所示:
下面是panic和recover兩個函數的解釋說明:https://golang.org/src/builtin/builtin.go?h=panic#L232
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。