GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic

首先讲一下异常捕获,与之相关的就要了解一下几个东西:

defer

       定义:defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。

       作用:defer在一些需要回收资源的场景非常有用,可以很方便地在函数结束前做一些清理操作,简单来说就是为了避免程序出错的一个机制

看详细解析:

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第1张图片

输出结果:

 

那么使用了defer会是怎么样的?

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第2张图片

输出:

 

结论:使用defer关键字,他所作用的函数总会在最后阶段才执行,这个是不是有那么一些像堆栈里面的栈?栈的特性就是先进后出

那么这样的特性我们可以用在那里?
那些操作是需要最后做一些事情的?

1.文件的读取,读取完成之后需要释放锁,方便其他程序读取文件

2.数据库的初始化的时候需要用到defer关闭数据库连接,要不然会造成连接数过多的结果

原理:锁的作用是独占资源,这样的话会有一个致命的问题:锁一直不释放,那么是不是资源一直被占用?其他想要用到这个资源的程序就一直不能使用,那么这个时候就需要用到defer,在使用完这个资源后腰释放锁,方便其他程序使用 


recover  与  panic

recover:是一个内建函数,用于从panic中恢复并继续执行程序。

panic:这个是golang中的一个错误机制,简单点来说就是一个异常捕获的类,在程序运行的过程中,如果出现了错误,golang会调用panic来提示错误,一旦调用了panic,代码将会停止运行,简单点来说代码就会卡在错误的地方,并且提示具体的错误。

那么我们假设一下:如果一个简单的错误,或者特出处理的一些过程,我们不需要代码中断,我们只需要提示一下,然后其余代码继续执行,那么我们就需要使用defer+recover来自定义一个错误捕获机制,类似于JAVA或者PHP中的try catch

看详细解析:

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第3张图片

 输出结果:

错误的示范:

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第4张图片

输出结果:

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第5张图片

结果显而易见:报错了,获取的结果没有输出,后续Say函数也不执行了,如果需要执行后续Say函数,就需要用到GoLang的错误捕获机制。

recover的返回值是一个错误err:

GOLANG 进阶 之 异常捕获:defer 与 recover 与 Panic_第6张图片

输出结果:

 

那我们看到:执行了Say函数,也输出了错误信息,代码也没有中断,那么目的就已经达到了,后续操作就看自己的业务需求了:

注意点:特别要注意!

defer + recover的位置一定要在业务代码前面,为什么这样讲?

前面说了这个是一种预防错误发生的机制,如果是结果在前面,就相当于事情已经发生了,再去做处理就已经迟了,如果一定是写在业务代码前面!

你可能感兴趣的:(GOLANG,golang,开发语言,后端,重构)