бросать и ловить исключение из функции - PullRequest
5 голосов
/ 06 февраля 2011
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.») Почему?

1 Ответ

9 голосов
/ 06 февраля 2011

бросок не всплывает через такой обратный вызов. Передайте обработчик ошибок и обработайте его вручную.

Позвольте мне проиллюстрировать ваши следы стека

Не существует соединения трассировки стека между функцией onreadystatechange и функцией connectTo. Поэтому, когда вы выдаваете ошибку, она никогда не всплывает до блока try catch вокруг connectTo.

Что Firefox делает, это говорит "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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...