JavaScript的catch块与错误的上下文
我有下面的代码:JavaScript的catch块与错误的上下文
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));
的ES5 specification说以下(强调):
try语句封闭的代码,其中一个特殊的 情况可能是,这样的块作为运行时错误或抛出语句。 catch子句提供了异常处理代码。
...
生产TryStatement:
try
座抓住如下评价:
- 让乙是评估座的结果。
- If B .type is not throw,return B。
- 返回评估结果Catch带参数B。
我的这种理解是,根据该规范,是没有办法的catch块无需先评估try块来执行。
谢谢。似乎是软件堆栈中某个地方的错误,并且所有副作用都会引发特定的代码。得到它的生活和工作... – Archimedix
我认为答案是否定的基础上,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');
}
请注意,条件catch子句是非标准的。我很确定他们不受WebKit支持(这是OPs应用程序运行的内容)。 –
@JamesAllardice你是对的。我会更新我的答案。 – AlexMA
你能显示更多代码吗? – sachleen
位置抛出的代码在哪里? – pimvdb
那些省略号将导致代码无法解析...你忽略了什么? – Prusse