try {
throw new Error('yikes!');
} catch (e) {
throw e;
} finally {
console.log('caught error!')
}
打印输出:
caught error!
Error: yikes!
那么< code>finally块是在throw语句之前运行的吗?
看起来只是最后一个块先运行,但我们可以看到实际情况并非如此:
let failed;
try {
throw new Error('yikes!');
failed = false;
} catch (e) {
failed = true;
throw e;
} finally {
console.log(`caught error! failed: ${failed}`)
}
指纹
caught error! failed: true
Error: yikes!
那么,为什么打印错误是带外的?这里是否有一些我没有看到的异步行为?
throw
语句不会打印任何内容。稍后当浏览器捕获抛出的错误时,将打印该错误。
< code>finally子句在整个< code>try块完成之前运行。记录的错误发生在运行时截获异常时,即在< code>try块完成之后。(请注意,您的< code>catch代码不< code>console.log()任何东西。它抛出一个新的异常,但是< code>finally子句仍然会在其他人看到之前运行。)
据我所知,所有带有< code>try catch finally的语言都以完全相同的方式运行。< code>finally块的作用是提供一个放置代码的地方,无论< code>try成功还是失败,代码都保证运行。
> < li>
尝试运行-您的尝试运行并引发错误
捕获运行 - 您的捕获捕获捕获错误并简单地重新抛出它。
最后运行-打印出字符串
重新抛出的错误现在被捕获了——并且您的浏览器记录了关于该错误的详细信息
问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:
问题内容: 考虑以下测试案例: 输出: 对于为什么在相反的情况下最终发生捕获的原因有何解释? 问题答案: 由于中的区块没有区块,因此只有。该代码不会像您认为的那样“跳回”调用者,然后再“跳回”到调用者。
问题内容: 看一下以下两种方法: 清楚地运行会导致,但不会运行(该程序似乎无限期地运行)。 这是为什么? 问题答案: 它不会永远运行。每次堆栈溢出都会导致代码移至finally块。问题在于这将需要非常,非常长的时间。时间顺序为O(2 ^ N),其中N是最大堆栈深度。 想象最大深度为5 要使每个级别进入finally块都需要两倍的时间,而堆栈深度可能是10,000或更大。如果您每秒可以进行10,00
我有一个作为模板的电子表格,最后两行以某种特定的方式格式化(颜色和字体)。 它看起来像这样: 我想做的是插入尽可能多的“占位符”行,让最后一行“滑”下来。 到目前为止,我尝试了,它确实插入了新行,但不会向下移动最后一行的颜色。这样我就可以在电子表格中找到我想要的数据,但是颜色格式错误(基本上第三行总是有彩色背景,而最后一行没有)。 我想做的伪代码是: 计算我需要添加多少占位符行, 获取电子表格 剪
我的项目由一个小图标组成,它在一个尺寸为25×20的网格上移动。我知道我可以用几个if/else块轻松地完成这项工作,但我想了解更多关于错误处理的知识。 我当时想的是使用try-catch,但它根本不会捕获数组索引越界异常或任何:它不会返回“error”或位置,因此它永远不会进入catch块。 我在想这样的伪代码: 实际代码:
问题内容: 当try块中存在时,我对try- finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时: 实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗? 问题答案: 从块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。 更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块