天天看點

GO語言中的panic、recover、defer

前言

在go語言中不存在try  catch異常處理邏輯,而我們可以使用panic recover defer來程式執行流程,借此來達到異常處理的目的。

Panic是一個可以停止程式執行流程的内置函數。 假設目前F函數當中某處代碼觸發panic函數,則F函數停止後面代碼的執行,轉而執行F函數内部的defer函數(前提已經聲明了defer函數),然後結束F函數,将目前處理權轉給F的調用函數。若果F的調用函數沒有recover捕捉異常,則會一直向上傳遞,直到main函數裡,該調用者會終止執行。如果F的調用函數使用recover捕捉異常,則F的調用者的調用者會繼續執行。

panic結束沒有傳回值,對于F的調用方M來說,F是調用panic函數結束的,而不是執行return結束的。

案例

注意:1.調用panic後,調用方函數執行從目前調用點退出。2.recover函數隻有在defer代碼塊中才會有效果。

func main() {
	f()
	fmt.Println("Returned normally from f.")//正常執行
}

func f() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered in f", r)
		}
	}()
	fmt.Println("Calling g.")
	g(1)
	fmt.Println("Returned normally from g.")//會終止執行
}

func g(i int) {
	defer fmt.Println("Defer in g", i)
	fmt.Println("Panicking!")
	panic(fmt.Sprintf("%v", i))
	fmt.Println("Printing in g", i)//終止執行
}
           

以上會輸出

Calling g.

Panicking!

Defer in g 1

Recovered in f 1

Returned normally from f.