登录
首页 >  Golang >  Go问答

为什么 `defer recover()` 不能捕获恐慌?

来源:Golang技术栈

时间:2023-05-01 18:51:24 292浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《为什么 `defer recover()` 不能捕获恐慌?》,就很适合你!文章讲解的知识点主要包括golang,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

为什么调用defer func() { recover() }()成功恢复恐慌的 goroutine,但调用defer recover()not?

作为一个简约的例子,这段代码不会恐慌

package main

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

但是,直接用recover替换匿名函数会出现恐慌

package main

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

正确答案

处理恐慌部分提到

两个内置函数panicrecover,有助于报告和处理运行时恐慌

recover函数允许程序管理恐慌 goroutine 的行为。

假设一个函数G 推迟了一个函数D,该函数调用recover并且 apanic出现在G正在执行的同一个 goroutine 上的一个函数中。

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

这说明这recover意味着在延迟函数中调用,而不是直接调用。
当它恐慌时,“延迟函数”不能是内置的recover(),而是在 defer 语句 中指定的。

DeferStmt = "defer" Expression .

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

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

好了,本文到此结束,带大家了解了《为什么 `defer recover()` 不能捕获恐慌?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>