go 錯誤處理

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

總結

  1. deffer 後的語句不會馬上執行,是在函數將要執行結束前執行的
  2. go 使用recover()函數獲取當前觸發的“異常”
  3. go 使用panic()函數主動拋出一個"異常"
  4. 即使函數運行過程中沒有發生任何異常,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
  1. recover函數獲取到的數據類型是string
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章