iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
1
自我挑戰組

Go從新學系列 第 20

[DAY 20]GO 的 Recover

  • recover 恢復流程

Recover 在 GO 裡就是一個錯誤修補機制

可以在我們遇到 error 的時候進行該執行的動作

如果沒有 Recover , panic 函式就會在 panic 結束後函式產生執行期(run-time)的錯誤

package main

import (
	"fmt"
)

func main() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)  //回傳panic內的提示訊息
		}
	}()

	fmt.Println(123)
	panic("Panic!")
	fmt.Println(456)

}

注意recover只在defer的函數中有效,如果不是在refer上下文中調用,recover會直接返回nil。

上述例子 defer 裡的函式 最後會回傳的是 panic 的提示訊息

通常也可以自行打印提示文字

接下來我們來判讀一段程式

package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	defer fmt.Println("defer main") // will this be called when panic?
	var user = os.Getgid()
	fmt.Println(user)
	go func() {
		defer func() {
			fmt.Println("defer caller")
			if err := recover(); err != nil {
				fmt.Println("recover success.")
			}
		}()
		func() {
			defer func() {
				fmt.Println("defer here")
			}()

			if user == -1 {
				panic("should set user env.")
			}
			fmt.Println("after panic")
		}()
	}()

	time.Sleep(1 * time.Second)
	fmt.Println("final?")
}

https://ieevee.com/tech/2017/11/23/go-panic.html

geteuid():返回有效用戶的ID,windows 上是 -1
time.Sleep(1 time.Second):time.sleep是讓程式延遲若干時間後再執行下去
這裡括號內就是( 1 * 秒 )

我們先從 defer 的角度一一看我們的 函式是怎麼疊上去的,才可以知道程式的運行順序


堆疊觀念


堆疊觀念:表示資料存取的順序為先進後出(First In Last Out,FILO)如圖中的物品A;或稱為後進先出(Last In First Out,LIFO),如圖中的物品E。


Defer 遵守著 LIFO 的觀念

有 defer 的就往下堆疊 最後出來

接著從上到下 一一取出列印

defer main 作為最先 defer 的對象 自然堆疊在最下方 ,最後出來

今天的特別複雜,想用點薩爾達結束這回合
https://ithelp.ithome.com.tw/upload/images/20191005/20121032SRWIQS3QM7.png


上一篇
[DAY 19]GO 的 Panic
下一篇
[DAY 21]GO 的 LOG(一)
系列文
Go從新學26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言