Go的defer(),panic(),recover()

defer()

当defer语 句被执行时,跟在defer后面的函数会被延迟执行,直到包含该defer语句的函数执行完毕时, defer后的函数才会被执行,不论包含defer语句的函数是通过return正常结束,还是由于panic 导致的异常结束。你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反。常用于进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func ReadWrite() bool {
file.Open("file")
// 做一些工作
if failureX {
file.Close()
return false
}

if failureY {
file.Close()
return false
}

file.Close()
return true
}

关闭资源的代码重复了很多次,这里就可以使用defer函数

1
2
3
4
5
6
7
8
9
10
11
func ReadWrite() bool {
file.Open("file")
defer file.Close()
if failureX {
return false
}
if failureY {
return false
}
return true
}

panic()

Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、

空指针引用等。这些运行时错误会引起painc异常。

一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成 线程,在第8章会详细介绍)中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信 息。日志信息包括panic value和函数调用的堆栈跟踪信息。

recover()

通常来说,不应该对panic异常做任何处理,但有时,也许我们可以从异常中恢复,至少我们 可以在程序崩溃前,做一些操作。举个例子,当web服务器遇到不可预料的严重问题时,在崩 溃前应该将所有的连接关闭;如果不做任何处理,会使得客户端一直处于等待状态。如果web 服务器还在开发阶段,服务器甚至可以将异常信息反馈到客户端,帮助调试。

如果在deferred函数中调用了内置函数recover,并且定义该defer语句的函数发生了panic异 常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运 行,但能正常返回。在未发生panic时调用recover,recover会返回nil。

文章作者: Luis
文章链接: https://warrest.github.io/2020/07/01/golang%E4%B8%AD%E7%9A%84Panic,Recover%E5%92%8Cdefer%E5%87%BD%E6%95%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Luis's Blog