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