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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章