Golang異常處理之panic、recover、defer

Golang不是面嚮對象語言,也沒有try ... catch... 或者 try ... exception... 結構。

Golang語言使用panic、recover,配合着defer,來完成類似功能。

defer本身用處很多,比如延後執行(函數結束時候才執行)。看個例子:

package main

import "fmt"

func main() {
	var i int
	defer fmt.Println("end")
	fmt.Println("begin: 0")
	i++
	fmt.Println(i)
}

//輸出結果:
begin: 0
1
end

panic和recover的需要注意幾點:

  1. defer 需要放在 panic 之前定義,另外recover只有在 defer 調用的函數中才有效
  2. recover處理異常後,邏輯並不會恢復到 panic 那個點去,函數跑到 defer 之後的那個點
  3. 多個 defer 會形成 defer 棧,後定義的 defer 語句會被最先調用

看個例子:

package main

import (
	"fmt"
	"time"
)

func main() {
	f()
	fmt.Println("end")
}

func f() {
	defer func() {
		fmt.Println("start defer part")
		if err := recover(); err != nil {
			fmt.Println("err: ",err)
			}
		fmt.Println("end defer part")
		}()
	for {
		fmt.Println("func begins")
		a := []int{1,2}
		fmt.Println(a[3])
		panic("bug occurs")
		fmt.Println("func ends")
		time.Sleep(1 * time.Second)
		}
}

//執行結果:
func begins
start defer part
err:  runtime error: index out of range
end defer part
end

程序執行結果,貌似往panic裏面扔什麼字符串都沒關係... 反正沒被引出來。
不管前面錯不錯,它就是強行觸發,執行退出(defer操作... )... 

具體錯誤信息,從recover()裏面讀出來。如果沒出錯,則不讀出... 

當前理解如此,後面如有新體會,則續寫本帖。

 

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