Go语言中使用panic和recover简化错误处理
来源:互联网 发布:python使用指南 下载 编辑:程序博客网 时间:2024/05/20 21:46
随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面。先来看看golang中通常的错误处理方法:
通常的error处理
package
main
import
(
"errors"
"fmt"
)
func
a() (err error) {
err = errors.New(
"错误"
)
return
}
func
main() {
err := a()
if
err != nil {
fmt.Println(err)
}
}
函数在返回的时候增加error类型的返回值,如果有错误则赋值给err,在调用函数处对err进行判断,如果不为nil则处理错误。这种方式在嵌套的层少的时候还好办,要是嵌套的层多了那就要一级一级的返回err,显然会很麻烦。如下面的代码:
package
main
import
(
"errors"
"fmt"
)
func
a() (err error) {
err = b()
if
err != nil {
return
}
err = c()
if
err != nil {
return
}
err = errors.New(
"a内错误"
)
return
}
func
b() (err error) {
err = errors.New(
"b内错误"
)
return
}
func
c() (err error) {
err = errors.New(
"c内错误"
)
return
}
func
main() {
err := a()
if
err != nil {
fmt.Println(err)
}
}
a函数内调用了b和c函数,调用后都要进行err != nil的判断,如果再来个d方法,e方法,那岂不是非常麻烦。在实际开发的时候,这种多层嵌套也经常存在,比如用户注册功能就要判断很多东西:表单验证是否OK;用户是否已经存在;数据插入是否OK等等。
用panic的尝试
于是我就想有没什么办法更加方便,至少不用调用每个函数都判断下err!=nil,这样就可以省掉三行代码。了解到golang中的panic方法可以直接中断流程,感觉到沿着这个应该能找到解决方法。了解了下panic的详细使用,其实也很简单,就是panic一下,如果需要捕获这个panic的错误,就在外围的方法事先声明recover方法。看下代码:
package
main
import
(
"log"
)
func
main() {
defer
func
() {
if
r := recover(); r != nil {
log.Printf(
"Runtime error caught: %v"
, r)
}
}()
a()
}
func
a() {
panic(
"a内错误"
)
}
a函数内抛出了错误,被外围事先defer的函数recover到,接着就能对错误进行处理了。用这样的方式来改造上面用err处理的代码看看。
package
main
import
(
"log"
)
func
a() {
b()
c()
panic(
"a内错误"
)
return
}
func
b() {
panic(
"b内错误"
)
}
func
c() (err error) {
panic(
"c内错误"
)
}
func
main() {
defer
func
() {
if
r := recover(); r != nil {
log.Printf(
"Runtime error caught: %v"
, r)
}
}()
a()
}
可以看到整个代码都简洁了很多,当然这里的代码比较简单可能看不出什么太大效果,在业务较为繁杂、经常要做各种校验的时候就可以显现出简洁了。
在开发api接口项目的时候,我会封装好recover的方法用来处理内部返回的错误信息,然后统一输出到客户端,感觉便捷很多。
转载请注明:快乐编程 » golang用panic和recover做业务流程中断的尝试
- Go语言中使用panic和recover简化错误处理
- Go语言panic和recover使用
- go语言之 panic, recover ——如何在go语言中优雅的处理错误
- GO语言异常处理机制panic和recover分析
- GO语言异常处理机制panic和recover分析
- 【Go学习】GO语言异常处理机制panic和recover分析
- golang错误处理之panic和recover
- go语言中的defer、panic、recover处理异常
- go语言中的defer、panic、recover处理异常
- 谈一谈Go的异常处理机制——panic和recover的使用和原理
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go panic, defer, recover 的异常处理
- Go的异常处理 defer, panic, recover
- Go语言学习笔记 --- defer 、panic 、recover
- Go学习笔记:panic()和recover()
- Go语言中的单元测试及反向代理
- 选择排序----数组实现
- 将求最长子序列的算法由O(n²)改进为O(n).
- SQL 获取连续编号中断号的最小值
- 部分真题整理4
- Go语言中使用panic和recover简化错误处理
- JSTL标签(可以直接在jsp页面格式化)
- 支持向量机之线性支持向量机(三)
- 容器 Collection和Map
- 黑马程序员-java-反射
- linux下好用的文本编辑器nano
- findContours函数参数说明
- Android中Activity四种启动模式和taskAffinity属性详解
- Java多线程通信