2011-02-06 67 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