1. 程式人生 > >go語言中使用defer、panic、recover處理異常

go語言中使用defer、panic、recover處理異常

baidu 繼續 spa hello http tid 處理流 dex integer

go語言中的異常處理,沒有try...catch等,而是使用defer、panic、recover來處理異常。

1、首先,panic 是用來表示非常嚴重的不可恢復的錯誤的。在Go語言中這是一個內置函數,如果在程序中遇到異常,或者調用panic函數,程序會立即退出(除非recover)。如下代碼:

package main

import "fmt"

func main() {
	a := 10
	b := 0
	c := a / b

	fmt.Println(c)
}

  程序的輸出如下:

?  demo06 go run main.go
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.main()
        /Users/qstudy/myfiles/project/src/go_dev/day11/demo06/main.go:8 +0x11
exit status 2

  在這個輸出中,我們可以看到有個panic。

2、defer能保證在函數結束最後執行該方法(有問題的或者引發panic的函數),但是有個條件:必須在錯誤出錯之前進行攔截,在錯誤出現後進行錯誤捕獲,如果在定義的方法中defer定義的方法如果在panic後面,defer定義的方法就無法執行到。如下代碼:

package main

import "fmt"

func test(i int) {
	var arr [10]int
	// 錯誤攔截必須配合defer使用,通過匿名函數使用,在錯誤之前引用
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()

	arr[i] = 123
	fmt.Println(arr)
}

func main() {
	i := 10
	test(i)
	fmt.Println("hello world")
}

  執行後輸出如下:

runtime error: index out of range
hello world

  從以上結果可以看出,如果panic被recover捕獲接收到,panic後的方法還是能繼續執行的。

來自一本書書上面的總結:

“當在一個函數執行過程中調用panic()函數時,正常的函數執行流程將立即終止,但函數中
之前使用defer 關鍵字延遲執行的語句將正常展開執行,之後該函數將返回到調用函數,並導致
逐層向上執行panic流程,直至所屬的goroutine 中所有正在執行的函數被終止。錯誤信息將被報
告,包括在調用panic()函數時傳入的參數,這個過程稱為錯誤處理流程。”

go語言中使用defer、panic、recover處理異常