Получить фактический объект ошибки 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);
});