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

Prawdopodobnie zostanie wykonana część "catch" (w konsoli pojawia się komunikat), ale wyjątek pozostaje niezakryty (= w konsoli pojawia się komunikat "Uncaught Troubles."). Dlaczego?wyrzucenie i wyłapanie wyjątku z funkcji

Odpowiedz

9

Rzut nie bańką się przez takie połączenie zwrotne. Przekaż wywołanie zwrotne błędu i poradź się go ręcznie.

Pozwól mi zilustrować swoją stos ślady

Nie ma połączenia między StackTrace funkcji onreadystatechange oraz funkcję connectTo. Więc kiedy rzucasz błąd, nigdy nie pęczniasz do bloku catch catch wokół connectTo.

Co firefox robi mówi "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

następnie OK, ale dlaczego jest tutaj try {} catch() dostępne do użytku? –

+0

@RadekSimko to nie jest. Ręczne obsługiwanie błędu tutaj – Raynos

+0

Nie mówię tutaj o twoim kodzie, po prostu mówię, dlaczego nie mogę użyć try {} catch() {} ogólnie dla wychwytywania wyjątków? –

Powiązane problemy