Получать уведомления, когда 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-адрес страницы с вызовом ошибки, возьмите любую другую информацию, которую вы можете сделать, чтобы облегчить отладку вашей жизни.