Go语言中的defer、panic和recover

=Start=

defer语句用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行,它会在外围函数或者方法返回之前但是其返回值(如果有的话)计算之后执行。

如果一个函数或者方法中有多个defer语句,它们会以LIFO(Last in First out)的顺序执行

常见用法如下:


通过内置的 panic() 和 recover() 函数,Go语言提供了一套异常处理机制。

Go语言将错误和异常两者区分对待:

  • 错误是指可能出错的东西,程序需要以优雅的方式将其处理(例如,文件不能被打开)。
  • 而异常是指”不可能”发生的事情(例如,一个应该永远为true的条件在实际环境中却是false的)。

Go语言中处理错误的惯用方法是将错误以函数或者方法的最后一个返回值的形式将其返回,并总是在调用它的地方检查返回的错误值

对于”不可能发生的情况”,我们可以调用内置的 panic() 函数,该函数可以传入任何想要的值。在其他语言中,这种情况下我们可能使用一个断言(参考之前的文章:Python中的assert),但在Go语言中我们使用panic()。

在早期开发以及任何发布阶段之前,最简单同时也可能是最好用的方法是调用 panic() 函数来中断程序的执行以强制发生错误,使得该错误不会被忽略因而能够被尽快修复。

一旦开始部署程序时,任何情况下都可能发生错误,但我们应该尽一切可能避免中断程序(panic + recover)。

对于任何情况下可能运行也可能不运行的函数或者方法,如果调用了panic()函数或者调用了发生异常的函数或者方法,我们应该使用recover()以保证将异常转换成错误。理想情况下,recover()函数应该在尽可能接近于相应panic()的地方被调用,并在设置其外围函数的error返回值之前尽可能合理的将程序恢复到健康状态

==

Go语言函数的返回值也可以是任意个,如果没有,那么返回值列表的右括号后面是紧接着左大括号的。

如果函数有返回值,则函数的最后一个语句必须是一个return语句或者panic()调用。如果函数是以抛出异常结束,Go编译器会认为这个函数不需要正常返回,所以也就不需要这个return语句。

=EOF=

声明: 除非注明,CrazyOf.me文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://crazyof.me/blog/archives/2537.html

《Go语言中的defer、panic和recover》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注