2011-02-06 38 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.'); 
} 

Có lẽ phần "bắt" sẽ thực thi (trong bảng điều khiển xuất hiện thông báo), nhưng ngoại lệ vẫn chưa được sắp xếp (= trong bảng điều khiển xuất hiện "Không bắt buộc đôi"). Tại sao?ném và bắt ngoại lệ từ chức năng

Trả lời

9

cú ném không bong bóng qua một cuộc gọi lại như thế. Vượt qua một lỗi xử lý gọi lại và xử lý nó theo cách thủ công.

Hãy để tôi minh họa cho chồng của bạn dấu vết

Không có kết nối stacktrace giữa chức năng onreadystatechange và chức năng connectTo. Vì vậy, khi bạn ném một lỗi nó không bao giờ bong bóng lên đến khối catch thử xung quanh connectTo.

gì firefox đang làm là nói "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 rồi, nhưng tại sao ở đây try {} catch() có sẵn để sử dụng? –

+0

@RadekSimko nó không phải. Xử lý lỗi của bạn bằng tay ở đây – Raynos

+0

Tôi không nói về mã của bạn ở đây, tôi chỉ nói, tại sao tôi không thể sử dụng try {} catch() {} generaly để bắt ngoại lệ? –

Các vấn đề liên quan