【GoLang】panic defer recover 深入理解


唉,只能說C程序員可以接受go的錯誤設計,相比java來說這個設計真的很差勁!

 

我認為知乎上說的比較中肯的:

 

 

1. The key lesson, however, is that errors are values and the full power of the Go programming language is available for processing them.

2. Use the language to simplify your error handling.

But remember: Whatever you do, always check your errors!

 

 

Golang這么時尚的語言是沒有類似try..catch 這種異常處理機制,而是使用 panic 和 recover處理異常. 其實相當於python的raise。

golang的異常處理組合 panic,defer,recover,跟java中的try catch finially是類似的。 但是從語言的用戶體驗來說,不怎么好。 但考慮到golang的場景基本是系統高性能層面的,這種精准錯誤處理應該減少那種后遺症bug。

 

該文章寫的有些亂,歡迎來噴 ! 另外文章后續不斷更新中,請到原文地址查看更新。

http://xiaorui.cc/?p=2909

 

使用panic拋出異常,拋出異常后將立即停止當前函數的執行並運行所有被defer的函數,然后將panic拋向上一層,直至程序carsh。但是也可以使用被defer的recover函數來捕獲異常阻止程序的崩潰,recover只有被defer后才是有意義的。

 

必須注意:

1.   defer 需要放在 panic 之前定義,另外recover只有在 defer 調用的函數中才有效。
2.   recover處理異常后,邏輯並不會恢復到 panic 那個點去,函數跑到 defer 之后的那個點.
3.   多個 defer 會形成 defer 棧,后定義的 defer 語句會被最先調用

panic (主動爆出異常) 與 recover (收集異常)

recover 用來對panic的異常進行捕獲. panic 用於向上傳遞異常,執行順序是在 defer 之后。 

我們舉個含有異常的例子:

 

 

如果你不把這個異常panic recover處理的化,那么就會發生下面的情況.

 

下面是處理panic的例子. 

 

那么上面代碼的運行結果是:

 

 

 

上面go代碼實例中,異常是我們通過panic方法主動拋出來的,但如果真的就出現了未知的異常咋辦?

 
我們可以看到出現的異常會走到defer這一步,defer這里可以打印具體的異常信息,defer運行完之后不能回到原點,控制權會被扔到該函數的外層,也就是調用這個函數的層,對應上面的代碼也就是main()函數。
 

上面go代碼運行結果是:

 

 

先前沒在意defer  recover  panic的注意事項,結果各種問題出現了。 不知道go以后會不會有try catch異常模式, 很是期待… 

 

END.

 

參考資料:

http://xiaorui.cc/2016/03/09/%E5%85%B3%E4%BA%8Egolang%E7%9A%84panic-recover%E5%BC%82%E5%B8%B8%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86/

http://www.linuxidc.com/Linux/2013-04/83105.htm

http://blog.csdn.net/wuwenxiang91322/article/details/9042503

 https://www.zhihu.com/question/27158146


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM