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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

// 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);
});