简单介绍:Go错误处理的方式
这里记录的是我个人不太熟练的语法和知识
详细内容移步:李文周的博客(非常详细)(虽然没有直接说,其实就是defer、panic、recover)
首先声明:一直以来,我以为错误处理是很高大上的东西,没怎么碰过,直到…看了这两份文档
https://blog.csdn.net/m0_38004619/article/details/98968097
https://www.cnblogs.com/zhangboyu/p/7911190.html
简单描述:在一个场景中,如果可能出现错误,那么首先定义defer + recover语句,接着如果程序panic掉了,defer中的recover就会捕获panic,然后处理掉。
经典的除零错误
func ads() int {
defer func() {
panic := recover()
if panic != nil {
// 在这里可以进行数据发送,
// 将错误信息发送给管理员,以便修改错误
fmt.Println("panic=", panic)
}
}()
num1 := 10
num2 := 0
end := num1 / num2
return end
}
panic= runtime error: integer divide by zero
#error&panic区别
Golang中引入error接口类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含error。error处理过程类似于C语言中的错误码,可逐层返回,直到被处理。
Golang中引入两个内置函数panic和recover来触发和终止异常处理流程,同时引入关键字defer来延迟执行defer后面的函数。
一直等到包含defer语句的函数执行完毕时,延迟函数(defer后的函数)才会被执行,而不管包含defer语句的函数是通过return的正常结束,还是由于panic导致的异常结束。你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反。
当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。如果一路在延迟函数中没有recover函数的调用,则会到达该携程的起点,该携程结束,然后终止其他所有携程,包括主携程。
错误和异常从Golang机制上讲,就是error和panic的区别。很多其他语言也一样,比如C++/Java,没有error但有errno,没有panic但有throw。