Как управлять неперехваченными исключениями в JavaScript, чтобы отображать сообщение об ошибке в пользовательском интерфейсе?

Когда на каком-либо веб-сайте или веб-приложении выдается исключение Uncaught Exception, в инструментах разработчика в каждом браузере появляется ошибка.

uncaught_exception

В Электрон, например, если неперехваченное исключение, разработчик может установить слушателя и делать все, что я хочу с сообщением об ошибке:

process.on('uncaughtException', function (error) {
    // Handle the error
}

Итак, мне интересно, есть ли простой способ сделать то же самое в JavaScript. Это может быть полезно для записи и хранения типичных ошибок при работе пользователей или для того, чтобы показать, что происходит пользователю, который может отправить отзыв разработчикам.

Вместо этого можно было бы показать что-то вроде этого

modal_exception

Иногда, если возникает ошибка, приложение переходит в нестабильное состояние, когда все зависает, и пользователь не знает, почему. Я считаю важным сообщить об ошибке.

Я нашел этот объект JavaScript Error. Его можно бросить вручную, но это можно использовать только при использовании try и catch, а не для неперехваченных исключений, где разработчик допустил некоторые ошибки.


person ChesuCR    schedule 19.06.2020    source источник


Ответы (2)


Вы можете обрабатывать его как прослушиватель событий на объекте окна.

window.onunhandledrejection = event => {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
};

window.onerror = function(message, source, lineNumber, colno, error) {
  console.warn(`UNHANDLED ERROR: ${error.stack}`);
};

Или еще вот так:

 window.addEventListener('error', function(event) { ... })

Подробнее о событии unhandledrejection можно прочитать в веб-документах MDN здесь и событие onerror в здесь

person Erin    schedule 19.06.2020
comment
Спасибо !! Это было то, что я искал :) - person ChesuCR; 19.06.2020
comment
Вы случайно не знаете, можно ли получить трассировку стека из объекта события? потому что я могу только понять причину - person ChesuCR; 19.06.2020
comment
Я нашел как это сделать, я просто добавил все возможные аргументы в onerror - person ChesuCR; 20.06.2020

person    schedule
comment
Спасибо за ответы. Но, пожалуйста, прочитайте весь вопрос, я ищу что-то для неперехваченных исключений. Я комментирую ваше решение в последнем абзаце - person ChesuCR; 19.06.2020
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Donald Duck; 19.06.2020