iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

30 天學 Golang?Go 啦哪次不 Go系列 第 17

Day17# panic & recover

第 17 天要介紹 golang 的例外處理,那麼我們就進入正題吧 ─=≡Σ(((っ゚∀゚)っ

panic

雖然說是例外處理,但其實 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

我們在執行程式時,不會希望一個小錯誤就導致整個程式碼壞光光。
而 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 後,就能夠讓函式繼續往下執行。

結尾

有任何問題歡迎與我告知 :)
本篇文章同步更新於我的部落格


上一篇
Day16# Channel
下一篇
Day18# Leetcode TwoSum
系列文
30 天學 Golang?Go 啦哪次不 Go20

尚未有邦友留言

立即登入留言