Golang 錯誤處理方式記錄
最近在研究golang 發現go並不存在類似java的try catch finally 異常處理機制,這裏記錄一下go的錯誤處理方式
測試代碼
- 代碼
package main
import "fmt"
func test1() {
fmt.Println("test1: Before define deffer")
defer func() { //定義錯誤處理
fmt.Println("deffer: begin")
err := recover() //獲取錯誤信息
fmt.Printf("recover: type=[%T] error=[%s]\r\n", err, err)
fmt.Println("deffer: end")
}()
fmt.Println("test1: After define deffer")
fmt.Println("test1: Before panic")
panic("panic Error") //拋出錯誤
fmt.Println("test1: After panic") //不會執行
}
func main() {
fmt.Println("main: Before call test1")
test1()
fmt.Println("main: After call test1")
}
- 得到的輸出
main: Before call test1
test1: Before define deffer
test1: After define deffer
test1: Before panic
deffer: begin
recover: type=[string] error=[panic Error]
deffer: end
main: After call test1
總結
- deffer 後的語句不會馬上執行,是在函數將要執行結束前執行的
- go 使用recover()函數獲取當前觸發的
“異常”
- go 使用panic()函數主動拋出一個
"異常"
- 即使函數運行過程中沒有發生任何異常,deffer後的語句依然會在函數結束前執行,但使用recover獲取到的錯誤信息是
nil
例如:將上例中panic註釋後得到的輸出爲
main: Before call test1
test1: Before define deffer
test1: After define deffer
test1: Before panic
test1: After panic //此處由於panic不存在 故該行也執行了
deffer: begin
recover: type=[<nil>] error=[%!s(<nil>)] //recover獲取到的數據爲nil
deffer: end
main: After call test1
- recover函數獲取到的數據類型是
string