1. 程式人生 > 其它 >【go筆記】錯誤處理

【go筆記】錯誤處理

go語言學習筆記之錯誤處理

前言

類似於try...catch...finally,go語言的錯誤處理機制是用deferpanicrecover

在Go語言中,錯誤和異常有errorpanic兩種。error一般是程式開發者預知的,會進行適當的處理,比如檢測使用者輸入不合法,丟擲一個error錯誤。panic是程式開發者無法預知的異常,比如引用的物件值為空。

error

Go語言提供了兩種建立error的方法,它們底層是一樣的,只是一種帶格式,一種不帶格式。

  • errors.New
  • fmt.Errorf

示例:

func ErrorUsage() {
    err := errors.New("err: found 1")
    if err != nil {
        fmt.Println(err.Error())
    }
    
    err2 := fmt.Errorf("err: %s", "found 2")
    if err2 != nil {
        fmt.Println(err2.Error())
    }
}

示例程式碼:計算倒數

package main

import (
	"errors"
	"fmt"
)
func reciprocal(n int) (float64,error) {
	// 計算倒數
	if n == 0 {
		return 0,errors.New("0不能為倒數")
	}
	return float64(1) / float64(n), nil
}
func main() {
	for i := 3;i >= 0;i-- {
		ret,err := reciprocal(i)
		// 對於函式返回值有錯誤error的情況下,要先判斷一下函式有沒有error。
		// 如果有error,就把錯誤資訊列印到控制檯,否則輸出計算得到的倒數值
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Printf("1/%d = %.3f\n",i,ret)
		}
	}
}
  • error作為函式的返回值,應放在返回值型別列表的末尾。

panic

在沒有recover的情況下,panic常常會導致程式崩潰。

示例程式碼

package main
import (
	"fmt"
)
func doPanic() {
	// doPanic: 當捕獲panic異常時觸發

	// 呼叫內建的recover()捕獲panic異常
	err := recover()
	if err != nil {
		// runtime error: integer divide by zero
		fmt.Println("doPanic()捕獲到異常:", err)
	}
}

func main() {
	// 註冊捕獲異常的處理函式
	defer doPanic()
	n := 0
	ret := 1 / n
	// 出現異常後,下面語句不會執行列印
	fmt.Println("main ret = ",ret)
}
  • Go語言中,recover只在defer呼叫的函式中有效,並且defer要先註冊,否則不能捕獲到panic異常。