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