JavaScript捕获具有错误上下文的块

时间:2012-06-19 15:18:29

标签: javascript pyqt try-catch qtwebkit

我有以下代码:

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

2 个答案:

答案 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 评估如下:

     
      
  1. B 成为评估阻止 的结果。
  2.   
  3. 如果 B .type不是throw,请返回 B
  4.   
  5. 使用参数 B 返回评估 Catch 的结果。
  6.   

我对此的理解是,根据规范,如果没有先评估try块,就无法执行catch块。