Golang 错误捕获Panic与Recover的使用
作者:头秃猫轻王
对于Go语言的错误是通过返回值的方式,本文主要介绍了Golang 错误捕获Panic与Recover的使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、Golang 错误是什么?
对于Go语言(Golang)的错误是通过返回值的方式,来强迫调用者对错误进行处理,要么你通过 _ 忽略,要么你处理。对于这种设计方式,我们通常需要会写大量的 if err != nil 判断。我们可以通过方法来做到校验。
这类代码非常的多,尽管工程中 error 大部分都是nil,也就是没有任何错误,但是非nil的时候,就意味着错误就出现了。
在Go语言中,使用多值返回来返回错误。Go中可以抛出一个 panic 的异常,然后在 defe r中通过 recover 捕获这个异常,然后再正常处理。
二、错误校验
1.方法
当存在错误时,我们通过方法来判断是否 panic:
func Panic(err error) { if err != nil { panic(err) } }
2.判断错误
代码如下(示例):
若不采用方法
for _, c := range []string{"1", "2"} { atoi, err := strconv.Atoi(c) if err != nil { return } fmt.Println(atoi) }
若采用方法
但此时 panic 还需要我们额外处理来将错误捕获
for _, c := range []string{"1", "2"} { atoi, err := strconv.Atoi(c) Panic(err) fmt.Println(atoi) }
三、错误捕获
1.方法
当存在错误时,我们通过recover来判断 panic 是否产生:
func RecoverError() { if err := recover(); err != nil { //输出panic信息 fmt.Println(err) //输出堆栈信息 fmt.Println(string(debug.Stack())) } }
2.defer 的使用
由于我们的捕获必须在错误产生之后,那我们就必须保证捕获方法调用在错误处理方法之后,也就是通过 defer 来控制方法的最后调用 :
func main() { // 当使用defer 时,将会在程序内方法结算后, // 依照后进先出的方法执行defer内方法 // 此时就能保证 捕获程序一定能捕获到错误 defer RecoverError() for _, c := range []string{"1", "2"} { atoi, err := strconv.Atoi(c) Panic(err) fmt.Println(atoi) } }
总结
通过以上来简单熟悉Golang 与其他语言截然不同的错误处理形式,由于其他语言开发者经常将异常与控制结构混在一起,这会很容易使得代码变得混乱。开发者也很容易滥用异常,甚至一个小小的错误都抛出一个异常。这在Golang中不被允许,Go语言也就不支持传统的 try…catch…finally 这种异常,通过新的 defer panic recover 来进行错误处理。
到此这篇关于Golang 错误捕获Panic与Recover的使用的文章就介绍到这了,更多相关Golang 错误捕获内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!