go errors

go errors

错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。

在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。

就像其他的内建类型(如 intfloat64 等),错误值可以存储在变量里、作为函数的返回值等等。

Go 语言中的错误处理是把错误当成一种值来处理,返回出去,谁调用我,谁处理,更强调判断错误、处理错误,而不是像python中用try-except 捕获异常

异常抛出与处理

异常抛出与处理 参考 go panic 与 recover

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

返回并处理错误

当然, 上述方法并不是go中推荐使用的。go 把错误当作参数返回的方法更推荐如下方法:也是目前用的最多的一种方法。

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

}

Error 接口

error接口类型

Go 语言中使用一个名为 error 接口来表示错误类型。

type error interface {
    Error() string
}

error 接口只包含一个方法——Error,这个函数需要返回一个描述错误信息的字符串。

当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值

由于 error 是一个接口类型,默认零值为nil。所以我们通常将调用函数返回的错误与nil进行比较,以此来判断函数是否返回错误

创建错误两种方式

我们可以根据需求自定义 error,最简单的方式是使用errors 包提供的New函数创建一个错误。除此之外还可以通过fmt包下的 fmt.Errof创建错误

errors.New
func New(text string) error

它接收一个字符串参数返回包含该字符串的错误。我们可以在函数返回时快速创建一个错误

func getCircleArea(radius float32) (float32,error) {
	if radius <= 0 {
		err := errors.New("半径不能小于0,您的半径是:`radius`")  // 生产error对象
		return 0, err
	}
	return 3.14 * radius * radius,nil
}
func main() {
	res,err := getCircleArea(-2)
	if err != nil{
		fmt.Println(err.Error())  // 输出error信息
		return
	}
	fmt.Println(res)

}
fmt.Errof

fmt.Errof创建错误相比errors.New 方式 ,能格式化字符串输出信息。但是用的少

func getCircleArea(radius float32) (float32,error) {
	if radius <= 0 {
		err := fmt.Errorf("半径不能小于0,您的半径是:%v", radius)
		return 0, err
	}
	return 3.14 * radius * radius,nil
}

func main() {
	res,err := getCircleArea(-2)
	if err != nil{
		fmt.Println(err.Error())  // 输出error信息
		return
	}
	fmt.Println(res)
}

自定义错误

只要实现了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)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值