当前位置: 首页 > 面试题库 >

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

高锦
2023-03-14
问题内容

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

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

package main

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

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

package main

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

问题答案:

该处理恐慌部分提到,

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

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

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

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

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

DeferStmt = "defer" Expression .

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

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



 类似资料:
  • 作为一个极简的示例,此代码并不恐慌 但是,直接用recover替换匿名函数会引起恐慌

  • 问题内容: 为什么这段代码没有抛出?看一看: 我不知道! 问题答案: 您为什么不能自己检查一下并抛出异常(如果您要的话)。

  • 问题内容: 我遇到了一个问题,即使它可以与他人正常工作,也无法使java.util.Scanner读取保存在记事本中的文本文件。基本上,当它尝试读取问题文件时,它完全是空手的- hasNextLine()为false,缓冲区为空,等等。我将其范围缩小到一个事实,即如果存在,它甚至不会读取第一行是文件中 任何地方 的卷曲报价。没有异常被抛出。请注意,同一文件上的BufferedReader没问题。

  • 问题内容: 我想在地图上显示许多不同的标签,所以我在面板中使用空布局,并为每个标签调用setLocation。但是由于某种原因,标签没有显示。如果删除pan.setLayout(null),则标签将出现在面板的顶部中央。为什么null布局不能与setPosition一起使用? 问题答案: 这是绝对定位(或布局)的问题。它要求您设置所有组件的大小,否则它们将保留为默认的零大小,并且不会显示。这就是为

  • 我想在地图上显示许多不同的标签,所以我在面板中使用null布局,并为每个标签调用setLocation。但是,由于某些原因,标签没有显示出来。如果我把锅拿开。setLayout(null),则标签显示在面板的顶部中心。为什么null布局不能与setPosition一起工作?