iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
DevOps

Golang X DevOps系列 第 6

Day06 - 抓出錯誤和處理錯誤

  • 分享至 

  • xImage
  •  
  • 想一下昨天和前天我們寫的 code ,假如今天我輸入一個空白值, 那系統會輸出空白。
  • 顯然地,在大部分情況下我們不會想要系統有這樣的錯誤出現,所以我們要去處理此類的Bug發生

Error

  • 打開前天寫的 greet.go 吧 我們要來對她動一點手腳

greet.go

package greeting

import (
    "errors"
    "fmt"
)

func Greet(name string) (string, error) {

    if name == "" {
        return "", errors.New("empty name")
    }


    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message, nil
}

  • 在原先的 greet.go 中 多 import errors 的 package(errors 在 go 中是拿來處理錯誤的 package)
  • 而在 function 回傳值增加一個error型態的回傳
  • 裏頭則是多增加一行判斷式 去判斷萬一 name 為空的情況
    • 若是為空 回傳 empty name 的錯誤
  • 在最後的回傳值 'nil' 則是代表著沒有錯誤的意思 當回傳時,caller就會知道說這個 function call 是成功的

寫完之後記得在該資料夾內 go mod tidy 一下 不然會抓不到errors喔

main.go

  • 回傳 error 之後 當然要有人來處裡這個 error
  • 通常在網頁伺服器上 我們常看的 log 就是拿來處理錯誤的 同樣地 在 go 裡 我們也是 log 來處理 error 的發生

package main

import (
	"fmt"
	"log"   // 引入 log package
	"modules_example/greeting"
)

func main() {

	log.SetPrefix("greeting: ")
	log.SetFlags(0)

	message, err := greeting.Greet("")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(message)
}

  • SetPrefix 代表說你 log 印出時的前墜字眼,因為我們發送 error 的 package 是 greet.go, 所以前墜設成 Greet 方便辨認是從哪一個 package 出來的
  • SetFlags表示 log 的表現形式,至於其他形式就要請大家去官網看看還有甚麼 flag 了
  • 接著,假如有收到 error 我們就用 Fatal 來印出這個error

這裡一樣要 go mod tidy

測試錯誤

  • 當你在跑 go run . 之後,輸入空值,結果要如下所示,代表你成功處理了這個錯誤


上一篇
Day05 - 有Module自遠方來 Import乎
下一篇
Day07 - 用程式幫你寫出工人智慧的 Test
系列文
Golang X DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
雷N
iT邦研究生 1 級 ‧ 2022-09-16 01:37:01

Hi 最後的紅字提醒區塊的Fatel
拼字錯誤,是FATAL喔
寫的很好懂! 祝完賽

我要留言

立即登入留言