2011-02-06 102 views
5
function connectTo(url) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == xhr.DONE) { 
      throw "Troubles."; 
     } 
    }; 
    xhr.send(); 
} 

try { 
    connectTo("http://www.google.com"); 
} catch (e) { 
    console.log('Exception happend.'); 
} 

也許「catch」部分將會執行(在控制檯中出現消息),但異常保持未捕捉(=在控制檯中出現「Uncaught Troubles。」)。 爲什麼?從函數中拋出並捕獲異常

回答

9

該投擲不會通過像這樣的回調起泡。傳入錯誤處理回調並手動處理。

讓我說明你的堆棧跟蹤

還有就是onreadystatechange的功能和connectTo功能之間沒有任何堆棧跟蹤連接。所以當你拋出一個錯誤時,它永遠不會冒泡到connectTo附近的try catch塊。

什麼火狐正在做的是說"Oh you did something that doesn't work. let me fix that for you and do what you think it does"

function connectTo(url, err) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == xhr.DONE) { 
      err.call(this, new Error("troubles")); 
     } 
    }; 
    xhr.send(); 
} 

connectTo("http://www.google.com", function(e) { 
    console.log(e); 
}); 
+0

OK的話,但爲什麼在這裏嘗試{}趕上()可供使用? – 2011-02-06 20:39:40

相關問題