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)
	}


}

posted @ 2022-03-19 21:56  刘清政  阅读(172)  评论(0编辑  收藏  举报