golang 如何利用defer+recover()函数 将指定类型的panic异常转换为函数返回 error返回 使用方法示例

在golang开发的时候,对于业务逻辑中的某些panic异常,我们希望将某些不可控的panic异常转换为普通的 error并作为函数返回值返回, 如io 或者os中的某些操作就会导致panic异常,对于这个过程中的某些不可控的panic异常我们希望将某些类型的异常转换为 普通的error变量在函数里面返回。

将指定类型的panic异常转换为函数返回 error返回 使用方法示例:


// readAll从r开始读取,直到出现错误或EOF,并返回它读取的数据
// 从分配有指定容量的内部缓冲区中提取。
// 如果缓存越界 会将panic抛出的bytes.ErrTooLarge这个异常作为返回值err返回
func readAll(r io.Reader, capacity int64) (b []byte, err error) {
	buf := bytes.NewBuffer(make([]byte, 0, capacity))
	// 如果缓存越界, biytes会panic抛出一个 bytes.ErrTooLarge 类型的异常
	defer func() {
		e := recover() // 捕获当前函数中的异常
		if e == nil {
			return // 未驳捕获到异常,正常返回
		}
		// 对捕获到的异常e 进行error断言 如果断言成功, 且异常类型是 内容过大 bytes.ErrTooLarge
		if errLarge, ok := e.(error); ok && errLarge == bytes.ErrTooLarge {
			err = errLarge // 将这个内容过大异常作为当前函数的error返回
		} else {
			panic(e) // 其他情况 当做panic异常抛出
		}
	}()
	_, err = buf.ReadFrom(r) // 将reader中的内容读取到缓存
	return buf.Bytes(), err
}

总结:在函数中使用defer语句加recover()函数捕获异常的方式对于需要将业务中某些不可控的panic异常转换为普通的返回参数error 时这种模式是非常有效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值