1. 程式人生 > 其它 >5-自定義errors

5-自定義errors

Go 語言中的錯誤處理是把錯誤當成一種值來處理,更強調判斷錯誤、處理錯誤,而不是用 catch 捕獲異常

1 異常丟擲與處理

package main

import "fmt"

func slicePanic()  {
	var s =[]int{4,5,6}
	fmt.Println(s[9])
}

func getCircleArea(radius float32)float32{
	if radius<=0{
		panic("半徑不能為0")
	}
	return 3.14*radius*radius
}

func recoverSlicePanic()  {
	defer func() {
		if err:=recover();err!=nil{
			fmt.Println(err)
		}
	}()
	slicePanic()
}
func recoverGetCircleArea(){
	defer func() {
		if err:=recover();err!=nil{
			fmt.Println(err)
		}
	}()
	getCircleArea(-9)
}
func main() {
	//1 系統丟擲異常
	//slicePanic()
	//2 使用者丟擲異常
	//res:=getCircleArea(-2)
	//fmt.Println(res)

	// 3 處理系統丟擲異常
	//recoverSlicePanic()

	// 4 處理使用者丟擲異常
	recoverGetCircleArea()
}

2 返回並處理錯誤

package main

import (
	"errors"
	"fmt"
)

// 返回錯誤
func getCircleArea(radius float32) (float32, error) {
	if radius <= 0 {
		return 0, errors.New("半徑不能小於0")
	}
	return 3.14 * radius * radius, nil
}
func main() {
	res,err:=getCircleArea(9)
	if err != nil {
		fmt.Println(err)
	}else {
		fmt.Println("圓的面積為",res)
	}

}

3 Error 介面

3.1 error介面型別

Go 語言中使用一個名為 error 介面來表示錯誤型別。

type error interface {
    Error() string
}

error 介面只包含一個方法——Error,這個函式需要返回一個描述錯誤資訊的字串。

當一個函式或方法需要返回錯誤時,我們通常是把錯誤作為最後一個返回值

由於 error 是一個介面型別,預設零值為nil。所以我們通常將呼叫函式返回的錯誤與nil進行比較,以此來判斷函式是否返回錯誤

3.2 建立錯誤

我們可以根據需求自定義 error,最簡單的方式是使用errors 包提供的New函式建立一個錯誤。

errors.New

func New(text string) error

它接收一個字串引數返回包含該字串的錯誤。我們可以在函式返回時快速建立一個錯誤

if radius <= 0 {
	return 0, errors.New("半徑不能小於0")
}

4 自定義錯誤

只要實現了error介面中的Error方法,就叫實現該介面,就是我們自定義的錯誤

package main

import (
	"fmt"
)

type radiusError struct {
	radius string
}

func (r *radiusError)Error()string  {
	return "出現錯誤,錯誤原因為:"+r.radius
}

func getCircleArea(radius float32) (float32, error) {
	if radius <= 0 {
		return 0, &radiusError{radius:"半徑不能小於0",}
	}
	return 3.14 * radius * radius, nil
}
func main() {
	res,err:=getCircleArea(-9)
	if err != nil {
		fmt.Println(err)
	}else {
		fmt.Println("圓的面積為",res)
	}


}