GoLang - 異常處理 - Panic 與 Recover

Golang - 異常處理

在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對拋出異常相關的 Panic 與 Recover 進行說明

Panic:

在 Go 語言沒有拋出例外的機制,如果在執行過程需要中斷目前的流程,則可以透過 panic 機制,

如果有使用 defer ,當我們呼叫 panic 時,程式會先執行 defer ,接著才會發生 panic 的 grouting 讓函數回傳,接著會退出程式。

func createPanic() {
  fmt.Println("create panic")
  panic("error happended")
}

func main() {
  createPanic
  //output "error happended"
}

輸出

create panic
panic: error happended

goroutine 1 [running]:
main.createPanic(...)
	/Users/go/main.go:7
main.main()
	/Users/go/main.go:26 +0x97
exit status 2

Recover:

recover 是一個函數,可以捕捉 panic 所輸入的值,並且讓程序繼續運行。

必須使用 defer 來執行 recover。

(前面我們提到,panic 觸發時,一樣會優先跑 defer ,因此在 defer 的 recover 才可發揮功用)

下面範例,示範透過一個 throwsPanic 函數來運行函數,若運行的函數或發生 panic ,則會透過 recover 來攔截:

func createPanic() {
  fmt.Println("create panic")
  panic("error happended")
}

func normanFn() {
  fmt.Println("normal function")
}

func throwsPanic(fn func()) (b bool) {
  defer func() {
    if x := recover(); x != nil {
      fmt.Println("recover happended")
      b = true
    }
  }()
  fn()
  return
}

func main() {
  throwsPanic(createPanic)
  //output "error happended", "recover happended"
  throwsPanic(normanFn)
  //output "normal function"
}