日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go 异常捕获处理 panic defer recover

發布時間:2024/2/28 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go 异常捕获处理 panic defer recover 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡言

在其他語言里,宕機往往以異常的形式存在,底層拋出異常,上層邏輯通過 try/catch 機制捕獲異常,沒有被捕獲的嚴重異常會導致宕機

go語言追求簡潔,優雅,Go語言不支持傳統的 try…catch…finally 這種異常

Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得代碼變得混亂

Go語言,可以使用多值返回來返回錯誤。不要用異常代替錯誤,更不要用來控制流程。在極個別的情況下,才使用Go中引入的Exception處理:defer, panic, recover

Go中,對異常處理的原則是:多用error包,少用panic

panic() 函數

函數中遇到panic語句,會立即終止當前函數的執行,在panic所在函數內如果存在要執行的defer函數列表,按照defer的逆序執行

recover() 函數

recover函數的返回值報告協程是否正在遭遇panic

有異常時,recover()只能調用一次,后面再次調用則捕獲不到任何異常

通常辦法:go中可以拋出一個panic的異常,然后在defer中通過recover捕獲這個異常,然后正常處理,從而恢復正常代碼的執行

實驗如下圖:

實驗代碼如下(已添加詳細注釋,不再一一詳述):

package main import ("fmt""runtime/debug" )// 異常處理函數1 func panicDeal1() {fmt.Println("panicDeal1,begin")if err := recover(); err != nil {fmt.Println("err1:", err) // 打印出異常(由于panicDeal2()中的recover函數已經捕獲了異常,所以這里捕獲不到異常,不會得到執行)fmt.Println(string(debug.Stack())) // 打印出堆棧信息}fmt.Println("panicDeal1,end") }// 異常處理函數2 func panicDeal2() {fmt.Println("panicDeal2,begin")if err := recover(); err != nil {fmt.Println("err2", err) // 打印出異常fmt.Println(string(debug.Stack())) // 打印出堆棧}fmt.Println("panicDeal2,end") }func test() {fmt.Println("1111")// 必須先聲明defer,否則不能捕獲panic異常defer panicDeal1()// 觸發panic時,逆序執行,也就是先執行 panicDeal2(),再執行 panicDeal1()defer panicDeal2()fmt.Println("2222")// 空指針賦值,產生崩潰var p *int*p = 1// 這里的代碼得不到執行fmt.Println("3333") }func main() {test() }

?

總結

以上是生活随笔為你收集整理的go 异常捕获处理 panic defer recover的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。