Перехват всех необработанных исключений javascript


113

Я пытаюсь найти или выяснить способ отображения в окне предупреждения всех необработанных исключений javascript в приложении. Я бы хотел, чтобы все это выполнялось на стороне клиента, без использования кода на стороне сервера. Я использую MVC3 в качестве среды.

Я исследовал последние несколько дней и не нашел именно то, что ищу.

Я нашел 2 способа ниже, которые кажутся почти тем, что я ищу, за исключением того, что эти способы настроены так, что вам нужно передать имя функции в пользовательский метод для печати трассировки стека всех необработанных исключений в этом одном специфическая функция. Я ищу способ избавиться от необходимости вручную передавать имя функции пользовательскому методу, который печатает трассировку стека для всех необработанных исключений. Я бы хотел, чтобы этот специальный метод просто «прослушивал» все необработанные исключения во всем приложении.

http://eriwen.com/javascript/js-stack-trace/

Также что-то похожее на предыдущую ссылку:

https://github.com/eriwen/javascript-stacktrace

Вот базовый код из второй ссылки выше, который печатает трассировку стека указанной функции javascript:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Итак, чтобы подвести итог, все ли вы знаете какой-либо способ иметь своего рода «слушателя», который будет прослушивать все необработанные исключения javascript и затем выводить их на экран в окне предупреждения?

Спасибо! Джейсон


одно ... почему бы вы использовали окно предупреждения?!? вы можете использовать console.log (error_message), чтобы ....
Mathlight

1
Я думаю, что этот вопрос « Поймай все ошибки JS» поможет тебе,
Пильгерсторфер Франц

Вероятно, вам стоит взглянуть на этот вопрос: stackoverflow.com/questions/205688/…
Марк,

Ответы:


130

Вы можете сделать это с помощью метода window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
Намного лучше, чем пытаться обернуть все мое приложение блоком try / catch. :) Спасибо!
Anthony

15
Просто предупреждаю: «Обратите внимание, что некоторые / многие события ошибок не вызывают window.onerror, вы должны специально их прослушивать». - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
нет необходимости включать имя функции (myErrorHandler) в этот код ... может быть просто функцией (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan, для отладки лучше иметь имя функции. Отладчик будет использовать имя функции вместо того, чтобы отображаться как анонимная функция.
Jerinaw

Это здорово и спасибо! пытался отладить сложный сценарий масштабирования фотографий, который отлично работает в 100% случаев, за исключением мобильного safai, где он случайно дает сбой и где нет окна «консоли» или «разработчика», чтобы увидеть, что произошло. Конечно, у меня есть собственное окно «отладки», которое я могу включить с помощью секретной кнопки, но у меня не было возможности глобально увидеть каждую ошибку, которую я не сделал, «попробуй / поймай». Это дополнение ТОЧНО показало мне, в чем проблема, и избавило меня от лишних волос! Хотел бы я проголосовать за это дважды!
Randy

49

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

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Если вы хотите отслеживать ошибки JavaScript, вы можете попробовать Atatus . Я работаю в Ататусе.


7
почему вы "вернули ложное" утверждение?
kumaresan_sd

@kumaresan_sd, он позволяет запускать обработчик событий по умолчанию: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Йенс Бодал

29

В дополнении к

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Вы также можете поймать все ошибки, возникшие внутри обещания callback ( .then()), прослушивающего unhandledrejectionсобытие

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
Нужно ли использовать оба window.onerrorи window.addEventListener("error", или достаточно одного из них?
Tormod Haugene

2
Вы можете использовать один из них. Если вы используете window.addEventListener("error", send useCaptureset to trueпозволяет также отлавливать ошибки элементов, которые не всплывали. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Хавьер Перес

1
Спасибо!! errorСобытие не ловил мою конкретную ошибку. unhandledrejectionполучил хотя.
Джо

throw new Error('tja');не попадает в последний хром с таким подходом ...
ОЗЗИ,

1
@JavierPerez Я тестировал, используя v80, привязал событие и сразу после этого выдал ошибку, и она не была обнаружена, а также не обнаружила синтаксических ошибок.
OZZIE

1

Посетите http://log4javascript.org, он основан на Log4J. Если большая часть вашего кода заключена в операторы try / catch для обработки исключений, вы можете использовать эту библиотеку в качестве общего интерфейса для отправки вывода в всегда доступное «диалоговое окно» или окно регистрации, которое может видеть ваш конечный пользователь. У вас даже может быть кнопка, которая выполняет window.print () для печати содержимого диалогового окна на принтере или в PDF. Удачи.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.