第 17 天要介紹 golang 的例外處理,那麼我們就進入正題吧 ─=≡Σ(((っ゚∀゚)っ
雖然說是例外處理,但其實 Go 並沒有真的拋出例外的機制,而是透過 panic
來讓當前執行的程式碼中斷流程。
package main
import (
"fmt"
"time"
)
func main() {
cat := ""
go func() {
defer func() {
fmt.Println("我是 defer")
}()
if cat == "" {
panic("我是 panic!")
}
}()
time.Sleep(1 * time.Second)
fmt.Println("這是 main 的最尾排")
}
// => 我是 defer
// panic: 我是 panic!
在進入 panic 的情境下,會在結束當下的 goroutine 並進行 defer,而這時候搭配 recover 服用,這樣就能夠擷取到 panic 的狀況進而達成類似 try...catch...
的方法。
我們在執行程式時,不會希望一個小錯誤就導致整個程式碼壞光光。
而 recover 能夠在接收到 panic 狀況時,作出處理的行為,這樣被中斷的程式碼就能夠繼續向下執行。
package main
import (
"fmt"
"time"
)
func main() {
cat := ""
func() {
defer func() {
if err := recover(); err != nil {
fmt.Println("讓開,我來 Recover!")
}
}()
if cat == "" {
fmt.Println("即將進入 panic 狀態")
panic("我是 panic!")
}
}()
time.Sleep(1 * time.Second)
fmt.Println("這是 main 的最尾排")
}
// => 即將進入 panic 狀態
// 讓開,我來 Recover!
// 這是 main 的最尾排
有了 recover 後,就能夠讓函式繼續往下執行。
有任何問題歡迎與我告知 :)
本篇文章同步更新於我的部落格