我有以下代码:
try {
...
try {
// This is *never* called
alert('TRY');
} catch (e) {
// But this *is* called
alert('CATCH');
}
} catch (e2) {
...
}
问题是,来自内部catch
块的警报已执行,但不来自内部try
的警报。
这是否可以按照规范进行,或者是否有人知道这里发生了什么? 例如可以例外异步代码进入另一个catch块的上下文?
请注意,这是我放在那里的真实代码,内部try
/ catch
没有任何遗漏!
在进入块之前可能会运行一些异步代码。
这是来自在PyQt 4.9.0和Qt 4.8.0中运行在WebKit / QtWebKit中的Web应用程序的代码。
好的,所以这里有一些内部try / catch(第一个省略号)之前的代码:
DoSomething(function () {
var updatePromises = [];
var p;
for (...) {
p = new Promise();
updatePromises.push(p);
// Run asynchronous code to fulfill promise.
// Calls are chained using an array and a "setTimeout()" mechanism.
tasks.chain(function (promise) { ... }, this, p);
}
(function () {
...
}).future().apply(this, updatePromises);
}.bind(this));
答案 0 :(得分:1)
我认为答案是否定的,基于mozilla reference。我建议你每次进入和退出一个区块时都要记录,看看是否有任何奇怪的东西在你错过了。也许也使用debugger;
。
或者尝试这个:
var foo = false;
try {
try {
foo = true;
throw true;
} catch (e) {
if(foo) {
alert('CATCH');
} else {
alert('HUH?');
}
}
} catch (e2) {
alert('CATCH2');
}
答案 1 :(得分:1)
ES5 specification说明以下内容(强调添加):
try语句包含一个异常的代码块 可能会发生条件,例如运行时错误或throw语句。该 catch子句提供了异常处理代码。
...
生产 TryStatement :
try
Block Catch 评估如下:
- 让 B 成为评估阻止 的结果。
- 如果 B .type不是throw,请返回 B 。
- 使用参数 B 返回评估 Catch 的结果。
醇>
我对此的理解是,根据规范,如果没有先评估try块,就无法执行catch块。