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"
}