Получать уведомления, когда JS ломается?

Я настроил PHP для отправки мне писем всякий раз, когда есть ошибка. Я хотел бы сделать то же самое с Javascript.

Также, учитывая тот факт, что это будет клиентская сторона, он открыт для злоупотреблений.

Каковы хорошие способы получения уведомлений по почте, когда JS ломается в веб-приложении?

Update:

Чтобы дать некоторую перспективу, я обычно загружаю несколько js файлов, включая библиотеки (большую часть времени jQuery).

Ответы

Ответ 1

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

Обратите внимание, что вам нужно убедиться, что он не работает бесконечно, когда он вызывает ошибку.

<script type="text/javascript">
var handlingError = false;

window.onerror = function() {
   if(handlingError) return;
   handlingError = true;

   // process error

   handlingError = false;
};
</script>

Ответ 2

Приведенный ниже код основывается на глобальном событии onError, он не требует никакой внешней библиотеки и будет работать в любом браузере.

Вы должны загрузить его перед любым другим script и убедитесь, что у вас есть сервер jserrorlogger.PHP скрипт, который забирает ошибку.

Код включает очень простой механизм самоограничения: он прекратит отправлять ошибки на сервер после 10-й ошибки. Это пригодится, если ваш код застрял в цикле, генерирующем миллионы ошибок.

Чтобы избежать злоупотреблений, вы должны включить в свой PHP-код аналогичный механизм самоограничения, например:

  • сохранение и обновление переменной сеанса с подсчетом ошибок и прекращение отправки писем после X ошибок за сеанс (при этом все они записываются в журналы)
  • сохранение и обновление глобальной переменной с ошибками в минуту и ​​прекращение отправки писем при превышении порогового значения.
  • разрешение только запросов, поступающих от пользователей, прошедших проверку подлинности (применяется только в том случае, если приложение требует аутентификации)
  • вы называете это:)

Обратите внимание, что для лучшего отслеживания ошибок javascript вы должны поместить соответствующий код в блоки try/catch и, возможно, использовать функцию printstacktrace, найденную здесь:

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

<script type="text/javascript">
  var globalOnError = (function() {
    var logErrorCount = 0;
    return function(err, url, line) {
      logErrorCount++;
      if (logErrorCount < 10) {
        var msg = "";
        if (typeof(err) === "object") { 
          if (err.message) {
            // Extract data from webkit ErrorEvent object
            url = err.filename;
            line = err.lineno;
            err = err.message;
          } else {
            // Handle strange cases where err is an object but not an ErrorEvent
            buf = "";
            for (var name in err) {
              if (err.hasOwnProperty(name)) {
                buf += name + "=" + err[name] + "&";
              }
            }
            err = "(url encoded object): " + buf;
          }
        }
        msg = "Unhandled exception ["+err+"] at line ["+line+"] url ["+url+"]";
        var sc = document.createElement('script'); sc.type = 'text/javascript';
        sc.src = 'jserrorlogger.php?msg='+encodeURIComponent(msg.substring(0, Math.min(800, msg.length)));
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(sc, s);
      }
      return false;
    }
  })();
  window.onerror = globalOnError;
</script>

Ответ 3

Вы завернули бы всю вашу программу в try/catch и отправили пойманные исключения через AJAX на сервер, на котором могло быть создано электронное письмо. За исключением этого (и я бы этого не делал), ответ "на самом деле".

Ответ 4

JA Auide имеет основную идею. Вы также можете пойти несколько между ними, т.е.:

  • Напишите функцию AJAX "errorNotify", которая отправляет данные об ошибке на сервер, чтобы они могли быть отправлены вам по электронной почте.
  • Оберните определенные части вашего кода (куски, которые, как вы ожидаете, могут когда-нибудь возникнуть) с помощью try/catch, который вызывает errorNotify в блоке catch.

Если вы действительно были обеспокоены наличием 0 ошибок вообще, тогда вы бы попробовали попробовать/поймать все свое приложение, но я думаю, что просто попробовать/поймать ключевые блоки даст вам 80% от стоимости на 20% усилия.

Ответ 5

Просто заметка от человека, который регистрирует ошибки JavaScript.

  • Информация, которая поступает из window.onerror, очень общая. Делает отладочную работу, и вы не знаете, что ее вызвало.
  • Пользовательские плагины также могут вызвать проблему. Очень распространенным в некоторых версиях Firebug было toString().
  • Вы хотите удостовериться, что вы не наводнили ваш сервер вызовами, ограничиваете количество ошибок, которые могут быть отправлены на страницу на страницу.
  • Обязательно запишите URL-адрес страницы с вызовом ошибки, возьмите любую другую информацию, которую вы можете сделать, чтобы облегчить отладку вашей жизни.