GoLang - 異常處理 - Panic 與 Recover

在這幾篇,會以 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"
}