clr错误8007000a程序将立即终止_GO语言入门-21、错误处理

本文详细介绍了Go语言中的错误处理机制,包括error接口的使用,如何通过Sqrt函数展示错误,以及panic与recover的用法及其在程序中的作用。重点讲解了panic、defer和recover之间的关系及在异常处理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

1、error

error类型是一个接口类型,这是它的定义:

type error interface {

Error() string

}

我们可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。

使用errors.New 可返回一个错误信息:

func Sqrt(f float64) (float64, error) {

if f < 0 {

return 0, errors.New("math: square root of negative number")

}

// 实现

}

在下面的例子中,我们在调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误,请看下面调用的示例代码:

result, err:= Sqrt(-1)

if err != nil {

fmt.Println(err)

}

实例:

0ffae93806075b0bf6bd17fecc23cab0.png
817b26621970cbfd043c7a9e29c6c0f2.png

执行以上程序,输出结果为:

4220d2735f1c656844f6a0efaca13aac.png

2、panic 与 recover、defer

panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误。

panic 用于主动抛出错误,recover 用来捕获 panic 抛出的错误。

(1)、引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。

(2)、发生panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。

(3)、panic不但可以在函数正常流程中抛出,在defer逻辑里也可以再次调用panic或抛出panic。defer里面的panic能够被后续执行的defer捕获。

(4)、recover用来捕获panic,阻止panic继续向上传递。recover()和defer一起使用,但是defer只有在后面的函数体内直接被掉用才能捕获panic来终止异常,否则返回nil,异常继续向外传递。

实例:

253fd92c521287abc18542deb3f2eaec.png
fa4f4d076f8755ab8008c62dd48b8672.png

3、总结几点 panic,defer 和 recover

1)、panic 在没有用 recover 前以及在 recover 捕获那一级函数栈,panic 之后的代码均不会执行;一旦被 recover 捕获后,外层的函数栈代码恢复正常,所有代码均会得到执行;

2)、panic 后,不再执行后面的代码,立即按照逆序执行 defer,并逐级往外层函数栈扩散;defer 就类似 finally;

3)、利用 recover 捕获 panic 时,defer 需要再 panic 之前声明,否则由于 panic 之后的代码得不到执行,因此也无法 recover;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值