为什么要defer func() { recover() }()成功恢复惊慌的goroutine调用,defer recover()而不能成功调用呢?
defer func() { recover() }()
defer recover()
作为一个简单的示例,此代码不会出现紧急情况
package main func main() { defer func() { recover() }() panic("panic") }
但是,用直接恢复紧急情况代替匿名功能
package main func main() { defer recover() panic("panic") }
该处理恐慌部分提到,
两个内置函数panic和recover,可帮助报告和处理运行时紧急情况 该recover功能允许程序管理恐慌性goroutine的行为。 假设一个函数G 推迟了D要调用 的函数 ,recover并且panic在执行该函数的同一个goroutine上的函数中出现了a G。 当延迟函数的运行达到时D,D调用的返回值recover将是传递给紧急调用的值。 如果D正常返回而没有开始新的恐慌,则恐慌序列将停止。
两个内置函数panic和recover,可帮助报告和处理运行时紧急情况
panic
recover
该recover功能允许程序管理恐慌性goroutine的行为。
假设一个函数G 推迟了D要调用 的函数 ,recover并且panic在执行该函数的同一个goroutine上的函数中出现了a G。
G
D
当延迟函数的运行达到时D,D调用的返回值recover将是传递给紧急调用的值。 如果D正常返回而没有开始新的恐慌,则恐慌序列将停止。
这说明recover应该在延迟函数中调用,而不是直接调用。 出现紧急情况时,“递延函数”不能是内置函数recover(),而是在 defer语句中 指定的函数。
recover()
DeferStmt = "defer" Expression .
表达式必须是函数或方法调用;不能用括号括起来。 内置函数的调用与 表达式语句 一样受到限制 。 除特定的内置函数外 ,函数和方法调用以及接收操作可以出现在语句上下文中。
表达式必须是函数或方法调用;不能用括号括起来。 内置函数的调用与 表达式语句 一样受到限制 。
除特定的内置函数外 ,函数和方法调用以及接收操作可以出现在语句上下文中。