JavaScript的catch块与错误的上下文

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)); 
+3

你能显示更多代码吗? – sachleen

+0

位置抛出的代码在哪里? – pimvdb

+0

那些省略号将导致代码无法解析...你忽略了什么? – Prusse

ES5 specification说以下(强调):

try语句封闭的代码,其中一个特殊的 情况可能是,这样的块作为运行时错误或抛出语句。 catch子句提供了异常处理代码。

...

生产TryStatementtry座抓住如下评价:

  1. 是评估的结果。
  2. If B .type is not throw,return B
  3. 返回评估结果Catch带参数B

我的这种理解是,根据该规范,是没有办法的catch块无需先评估try块来执行。

+0

谢谢。似乎是软件堆栈中某个地方的错误,并且所有副作用都会引发特定的代码。得到它的生活和工作... – 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'); 
} 
+2

请注意,条件catch子句是非标准的。我很确定他们不受WebKit支持(这是OPs应用程序运行的内容)。 –

+0

@JamesAllardice你是对的。我会更新我的答案。 – AlexMA