iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

golang初探系列 第 20

day20-defer 及 錯誤處理

  • 分享至 

  • xImage
  •  

Defer

在開發過程當中,常常會使用到文件或數據庫,為了在函數執行完及時釋放資源,golang 提供 defer
會將 func 語句完全跑完,當執行完在執行 defer 的語句,defer 為後進先出的概念
故接近底部的 defer 語句,會越先執行

package main

import (
	"fmt"
)

func main() {
	sum(10, 20)

}

func sum(a, b int) int {
	result := 0
	defer fmt.Printf("a:%d\n", a)
	defer fmt.Printf("b:%d\n", b)
	defer fmt.Printf("a + b before result:%d\n", result)
	result = a + b
	defer fmt.Printf("a + b after result:%d\n", result)
	return result
}

錯誤處理

Panic

發生錯誤(panic)就會崩潰退出,比較偏向非預期錯誤(算是最嚴重的錯誤)
在撰寫程式碼過程當中,我們會希望在發生異常時,不要導致整個程式碼崩潰
故後續會討論到如何處理非預期異常並將這些異常緊急處理,成為可預期的 error
在 golang 不支持 try...catch...finally

package main

import (
	"fmt"
)

func main() {
	sum()

}

func sum() int {
	sum := 0
	for i := 0; i <= 10; i++ {
		sum += i
		if i == 5 {
			panic("發生恐慌")
		}
	}
	fmt.Println(sum)
	return sum
}

Recover

捕獲 panic 錯誤,讓程式碼可以繼續執行下去

package main

import (
	"fmt"
)

func main() {
	fmt.Println(sum())

}

func sum() int {
	defer func() {
		error := recover()
		fmt.Printf("捕獲異常 error 為 %s\n", error)
	}()
	sum := 0
	for i := 0; i <= 10; i++ {
		sum += i
		if i == 5 {
			panic("發生恐慌")
		}
	}
	fmt.Println(sum)
	return sum
}


上一篇
day19-控制流程(for、break、continue、Goto)介紹
下一篇
day21-Interface 及 Type Assertions
系列文
golang初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言