为什么要defer func() { recover() }()
成功恢复惊慌的goroutine调用,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上的函数中出现了aG
。当延迟函数的运行达到时
D
,D
调用的返回值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一起工作?