iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0

Day10. 錯誤處理

今天來講在Go語言中如何進行錯誤處理。因為在Go語言中進行錯誤處理跟其他語言的差異很大,因此我需要單獨寫一篇文章介紹

簡介

當我們在開發過程中可能因為各種原因(如忘記分號,縮排錯誤或是邏輯錯誤)造成異常,這時程式語言通常會拋出各種錯誤,然後退出程式,這時就需要進行錯誤處理。
錯誤處理的主要目的是確保程式能夠在面臨預期外的情況時依然表現得穩健,而不會崩潰或產生不正確的結果。在大型專案中,良好的錯誤處理策略還能幫助快速定位問題,減少調試和維護的成本。

Go語言不像一些其他語言那樣有例外(exceptions)機制,而是採用了一種簡單而明確的錯誤處理方式,即通過返回值來傳遞錯誤。不過這對於從其他語言開始學習的人會非常不習慣,如os.Open這個用於開啟檔案的function它會回傳檔案物件與err(錯誤物件),如果檔案能正常被打開則errnil,反之則會將錯誤原因包為Error物件後回傳

Usage

f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
// do something with the open *File f

// 在 golang 中 error 型態底層是 interface,這個 error 裡面有 Error() 這個 function,並且會回傳 string
type error interface {
    Error() string
}

如果要自訂Error物件的話則有以下幾種方式

  1. 自己定義Error struct與interface
// A Tour of Go,https://tour.golang.org/methods/19

// STEP 1:定義客製化的 error struct
type MyError struct {
	When time.Time
	What string
}

// STEP 2:定義能夠屬於 Error Interface 的方法
func (e MyError) Error() string {
	return fmt.Sprintf("at %v, %s", e.When, e.What)
}

然後在自己的Function中需要拋出錯誤的地方初始化struct並回傳就行

  1. 使用errors套件中的errors.New()來建立error物件
import (
  "fmt"
  "errors"
)

func checkUserNameExist(username string) (bool, error) {
	if username == "bar" {
		return true, errors.New("username bar is already exist")
	}

	return false, nil
}

func main() {
	if _, err := checkUserNameExist("bar"); err != nil {
		fmt.Println(err)
	}
}
  1. 透過fmt套件的err.Errorf
func checkUserNameExist(username string) (bool, error) {
	if username == "foo" {
    // 搭配 fmt.Errorf 來產生錯誤訊息
		return true, fmt.Errorf("username %s is already existed", username)
	}

	return false, nil
}

判斷錯誤類型

// 可以透過`err.(Type) 檢查該錯誤的類別,常用於判斷錯誤是否為自訂錯誤
errObject, isMyError = err.(MyError)

那麼今天的文章就到這告一段落,如果我的文章有任何地方有錯誤請在留言區反應
明天將會介紹Go語言的檔案處理
time

REF


上一篇
Day9. 函式
下一篇
Day11. 檔案處理
系列文
可以Go一輩子嗎?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
雷N
iT邦研究生 1 級 ‧ 2024-09-18 13:10:47
c8763yee iT邦新手 3 級 ‧ 2024-09-18 21:27:39 檢舉

學到了,原來Go的Error處理機制還有這麼多學問

我要留言

立即登入留言