2012-06-19 39 views
3

我有下面的代碼: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

回答

1

ES5 specification說以下(強調):

try語句封閉的代碼,其中一個特殊的 情況可能是,這樣的塊作爲運行時錯誤或拋出語句。 catch子句提供了異常處理代碼。

...

生產TryStatementtry座抓住如下評價:

  1. 是評估的結果。
  2. If B .type is not throw,return B
  3. 返回評估結果Catch帶參數B

我的這種理解是,根據該規範,是沒有辦法的catch塊無需先評估try塊來執行。

+0

謝謝。似乎是軟件堆棧中某個地方的錯誤,並且所有副作用都會引發特定的代碼。得到它的生活和工作... – Archimedix

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'); 
} 
+2

請注意,條件catch子句是非標準的。我很確定他們不受WebKit支持(這是OPs應用程序運行的內容)。 –

+0

@JamesAllardice你是對的。我會更新我的答案。 – AlexMA