再讀Golang中的異常處理

2021-09-28 19:53:19 字數 2821 閱讀 7757

一起重溫golang中的異常處理啊?

注意事項

常規使用

panic以及recover引數型別為空介面(可儲存任何型別物件)inte***ce{}

/*

func panic(v inte***ce{})

func recover() inte***ce{}

執行順序:panic()->帶recover的defer

輸出結果:

oh my god!panic.

解釋:defer中的recover成功捕獲到了panic的異常

*/package main

import (

"fmt"

)func main()

}()panic("oh my god!panic.")

}

延遲呼叫中引發的錯誤,可被後續延遲呼叫捕獲(僅最後乙個錯誤**獲)

/*

執行順序:panic()->帶panic的defer匿名函式->帶recover()的defer匿名函式

輸出結果:

catch the panic

解釋:defer中的recover僅能捕獲最後乙個錯誤

package main

import (

"fmt"

)func main()

}()defer func() ()

panic("something panic!")

}

捕獲函式recover()只有在defer呼叫內直接呼叫才會終止,否則返回nil

/*

**執行順序:panic->在匿名函式中巢狀recover的defer函式->帶fmt的defer->帶recover的defer->在匿名函式中呼叫recover的defer

輸出結果:

defer inner

defer recover panic error

解釋: 多個defer之間形成defer棧,最底部的defer優先執行;第三個defer列印了recover()的零值`nil`,僅有第乙個defer成功捕獲了最底部的panic("panic error")

*/package main

import "fmt"

func main() ()

defer recover()

defer fmt.println(recover())

defer func() ()

}()panic("panic error")

}

將**塊放置在匿名函式中可實現在函式邏輯中進行異常恢復,而不影響主函式

/*

**執行順序:匿名函式中的panic語句->匿名函式中i自加運算->匿名函式中的fmt->匿名函式中的defer->主函式中的fmt

輸出結果:

i is: 2

解釋:panic會終止其之後的執行,因此優先執行匿名函式中的panic之後便被defer中的recover捕獲,將i賦值為2,其後匿名函式退出開始繼續執行主函式中的fmt.println語句

*/package main

import "fmt"

func main()

func test()

}()panic("something panic!")

i = 8

fmt.println("no panic, i is:",i)

}()fmt.println("i is:",i)

}

goroutine中的recover

注意:如果乙個沒有recovergoroutine發生了panic,那麼整個程序都會掛掉

/*

sync.waitgroup用來等待一組goroutine的結束,add方法用來設定等待的goroutine數量,done方法表示乙個goroutine執行結束,使用wait方法將全部的goroutine阻塞住,直到全部goroutine執行完畢

**執行順序:goroutine中的邏輯->wg.wait()->fmt.println

輸出結果:

panic recover assignment to entry in nil map

donw

解釋:在goroutine中我們宣告了乙個info的map[string]string型別,我們都知道在map,slice,channel都是引用型別,需要使用make函式進行初始化操作之後進行賦值。而這裡直接使用info["name"] = "bgbiao"進行賦值導致panic,fmt.println函式就會被終止執行,從而執行帶recover的defer,之後執行帶wg.done()的defer並退出goroutine執行主程式邏輯

*/package main

import (

"fmt"

"sync"

)func main()

}()var info map[string]string

info["name"] = "bgbiao"

fmt.println(info)

}()wg.wait()

fmt.println("done")

}

golang 異常處理

一般異常可以直接用 errors 包接收以及捕獲能遇見的異常,func test1 a,b int value int,err error else golang 允許多個返回值 error 常用語自定義異常丟擲返回異常包含一般異常 常用於不可預見不知情遇見的異常 panic可在程式中直接呼叫 pa...

golang中的異常處理機制

直接擼碼它不香麼 import errors fmt func main num1 2 num2 0 除零操作 res num1 num2 fmt.println res funcerro 2 自定義異常處理 在go中支援支援自定義異常處理 使用errors.new 和 panic 內建函式來處理 ...

golang 錯誤處理與異常

golang 中的錯誤處理的哲學和 c 語言一樣,函式通過返回錯誤型別 error 或者 bool 型別 不需要區分多種錯誤狀態時 表明函式的執行結果,呼叫檢查返回的錯誤型別值是否是 nil 來判斷呼叫結果。golang 中內建的錯誤型別 error 是乙個介面型別,自定義的錯誤型別也必須實現為 e...