Go語言錯誤處理機制

尹正杰發表於2024-07-21

目錄
  • 一.利用defer+recover捕獲錯誤
  • 二.基於errors.New自定義錯誤
  • 三.panic自定義錯誤

一.利用defer+recover捕獲錯誤

package main

import "fmt"

func cal(a, b int) (res int) {

	// 利用defer+recover來捕獲錯誤提高程式的健壯性,避免程式直接崩潰
	//
	// 溫馨提示:
	//		(1)recover()必須搭配defer使用;
	//		(2)defer一定要在可能引發panic的語句之前定義;
	defer func() {

		// 呼叫recover內建函式,可以捕獲錯誤
		err := recover()

		// 如果沒有捕獲錯誤,返回值為零值(nil)
		if err != nil {
			fmt.Printf("錯誤捕獲err: [%v]\n", err)
		}
	}()

	// 注意,除數不能為0,否則會丟擲異常喲~
	res = a / b

	// 如果上一行程式碼執行出錯,就不會執行下面的一行程式碼啦~
	fmt.Println("cal 函式執行結束")

	return
}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result := cal(x, y)

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函式執行結束")
}

二.基於errors.New自定義錯誤

package main

import (
	"errors"
	"fmt"
)

func cal(a, b int) (res int, err error) {

	defer func() {

		err := recover()

		if err != nil {
			fmt.Printf("錯誤捕獲err: [%v]\n", err)
		}

	}()

	if b == 0 {
		// 丟擲自定義錯誤,需要呼叫errors包下的New函式
		return res, errors.New("除數不能為0喲~")
	} else {
		// 如果除數不為0,那麼就可以正常執行了
		res = a / b
		fmt.Println("cal 函式正常執行結束")

		// 如果沒有錯誤,返回零值即可
		return res, nil
	}

}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result, err := cal(x, y)
	if err != nil {
		fmt.Printf("cal 函式異常執行結束,err ---> [%v]\n", err)
	}

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函式執行結束")
}

三.panic自定義錯誤

package main

import (
	"errors"
	"fmt"
)

func cal(a, b int) (res int, err error) {

	defer func() {

		err := recover()
		if err != nil {
			fmt.Printf("錯誤捕獲err: [%v]\n", err)
		}

	}()

	if b == 0 {
		return res, errors.New("除數不能為0喲~")
	} else {
		res = a / b
		fmt.Println("cal 函式正常執行結束")
		return res, nil
	}

}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result, err := cal(x, y)
	if err != nil {
		// 如果程式出現錯誤以後,後續程式碼沒有必要執行,想要程式中斷退出程式,可以藉助內建函式(builtin)包下內建函式: "panic"。
		panic(err)
	}

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函式執行結束")
}



相關文章