一尘不染

为什么`defer recovery()`不会引起恐慌?

go

为什么要defer func() { recover() }()成功恢复惊慌的goroutine调用,defer recover()而不能成功调用呢?

作为一个简单的示例,此代码不会出现紧急情况

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}

但是,用直接恢复紧急情况代替匿名功能

package main

func main() {
    defer recover()
    panic("panic")
}

阅读 230

收藏
2020-07-02

共1个答案

一尘不染

处理恐慌部分提到,

两个内置函数panicrecover,可帮助报告和处理运行时紧急情况

recover功能允许程序管理恐慌性goroutine的行为。

假设一个函数G 推迟了D要调用 的函数
recover并且panic在执行该函数的同一个goroutine上的函数中出现了a G

当延迟函数的运行达到时DD调用的返回值recover将是传递给紧急调用的值。
如果D正常返回而没有开始新的恐慌,则恐慌序列将停止。

这说明recover应该在延迟函数中调用,而不是直接调用。
出现紧急情况时,“递延函数”不能是内置函数recover(),而是在
defer语句中 指定的函数。

DeferStmt = "defer" Expression .

表达式必须是函数或方法调用;不能用括号括起来。
内置函数的调用与 表达式语句
一样受到限制

除特定的内置函数外 ,函数和方法调用以及接收操作可以出现在语句上下文中。

2020-07-02