Получить фактический объект Javascript Error с помощью window.onerror - PullRequest
46 голосов
/ 18 августа 2011

Javascript имеет этот замечательный обратный вызов window.onerror.Это довольно удобно, чтобы отследить любую ошибку.Однако он вызывает с именем ошибки, именем файла и строкой.Это, конечно, не так богато, как получение фактического объекта ошибки из оператора try...catch.Фактический объект ошибки содержит намного больше данных, поэтому я пытаюсь получить это.К сожалению, оператор try...catch не работает нормально, когда вы начинаете иметь асинхронный код.

Есть ли способ объединить и получить лучшее из обоих миров?Сначала я искал способ получить ошибку last , вызванную в блоке onerror, но похоже, что JS этого не хранит.

Любая подсказка?

Ответы [ 3 ]

47 голосов
/ 07 января 2014

теперь это возможно в некоторых браузерах. spec был обновлен, чтобы включить фактическую ошибку с помощью трассировки стека в качестве 5-го параметра.

проблема в том, что не все браузеры поддерживают это, поэтому вы можете сделать что-то вроде этого:

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
        //handle the error with stacktrace in error.stack
    }
    else
    {
        //sadly only 'message', 'filename' and 'lineno' work here
    }
};
10 голосов
/ 18 августа 2011

Если вы имеете в виду трассировку стека объекта ошибки, то AFAIK, это невозможно.

Простая причина в том, что трассировка стека связана с контекстом выполнения, в котором были созданы или выброшены исключения времени выполнения (обработанные с помощью try ... catch ... finally) (с new Error() или throw).

В то время как window.onerror вызывается, он вызывается в другом контексте.

Вы можете получить пробег, проверив window.event (недоступно в FF) в обработчике onerror.

5 голосов
/ 02 февраля 2016

Современные браузеры полностью поддерживают черновую спецификацию HTML 5 для ErrorEvent и window.onerror.В обоих этих браузерах вы можете использовать window.onerror или (что удивительно!) Правильно связать с событием error:

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});
...