Получить фактический объект Javascript Error с помощью window.onerror

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

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

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

3 ответа

Решение

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

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

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

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

Теперь это возможно в некоторых браузерах. Спецификация была обновлена, чтобы включить фактическую ошибку с помощью tracetrace в качестве 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
    }
};

Современные браузеры полностью поддерживают проект спецификации 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);
});
Другие вопросы по тегам