Лучшая практика для сообщения об ошибках клиента с window.onerror? - PullRequest
14 голосов
/ 26 октября 2011

Я бы хотел отлавливать все ошибки JavaScript на нашем сайте и регистрировать их. Каковы некоторые рекомендации для этого?

Мысль:

  • Я могу легко добавить обработчик /log/ в наше веб-приложение, проанализировать параметры GET / POST и использовать нашу существующую систему ведения журналов на стороне сервера. Это слишком очевидно?
  • Работает ли window.onerror везде? Что если в обработчике произойдет ошибка?
  • Должен ли я прикрепить тег <img> к странице или сделать запрос XmlHttpRequest? Что делать, если XHR не работает?
  • Как насчет неработающих изображений и сбоев jQuery Ajax - могу ли я их тоже перехватить?

Ответы [ 4 ]

6 голосов
/ 07 ноября 2011

Все предложения Jbecwar и dgvid - это круто, я бы добавил:

  • обратите внимание, что Opera не поддерживает событие ошибки, см. событие ошибки quirksmode
  • сбор трассировок стека с помощью stacktrace.js может помочь в устранении ошибок
  • , если обработчик ошибок не может отправить отчет об ошибках на стороне сервера, отменить использование файлов cookie: установить cookie для errors.yourdomain.com с base64закодированный отчет об ошибках (сжатый?) и запросить пустое изображение размером 1x1 пикселей из этого домена на каждой странице
  • или использовать локальное хранилище HTML5 и загрузить его, когда вы сможете
3 голосов
/ 30 апреля 2012

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

Простой используемый нами код доступен на github по адресу https://github.com/shyam-habarakada/js-watson

Со всей аналитической мощью Google Analytics и этой простой техникой,мы добились больших успехов в выявлении частых и критических ошибок и смогли быстро их устранить.Вы также можете использовать возможности GA для анализа тенденций общих ошибок, конкретных ошибок в определенных файлах и т. Д. И т. Д. Настоятельно рекомендуется.

3 голосов
/ 03 ноября 2011

Как предполагает Jbecwar, обработчик журнала - это хорошая идея, но вам нужно следить за условием, при котором вы пытаетесь вызвать обработчик журнала, чтобы сообщить об ошибке при обращении к обработчику журнала.Если браузер теряет соединение с сервером, вы не сможете записать это обратно на сервер.

Вы можете отследить ошибку загрузки img, подключив обработчик ошибок к элементу img, затемустановка его атрибута src.Например, используя jQuery:

$("img#my-image").error(onImgError).prop("src", "images/my-image.jpg");

Вы не получите много информации таким образом, только тот факт, что произошла ошибка при попытке загрузить указанный элемент.

Вы можете обрабатывать сбоив jQuery.ajax запросы включаются функцией обратного вызова с ошибкой в ​​объект настроек, передаваемой в $ .ajax.Обязательно оберните код в функции обратного вызова success и error в try-catch.

Как правило, вы захотите защитить свой код с помощью блоков try-catch, чтобы вы могли перехватывать и регистрировать ошибки.Обработка window.onerror должна быть последним средством - для вещей, которые проскальзывают.

В вашем обработчике window.onerror оберните все в блок try-catch и убедитесь, что вы не выбросите код из кода вблок catch (используя вложенные try-catch, если необходимо).

3 голосов
/ 03 ноября 2011

Обработчик журнала звучит как хорошая идея, но я бы ограничил количество отчетов или попыток, которые делает отчет.Например, вы не хотите, чтобы у репортера была ошибка, а затем пытайтесь сообщать о ней снова и снова.Также, если у вас плохой клиент или всплеск трафика, вы не хотите слишком много регистрироваться.

Кроме того, window.onerror не будет работать для фреймов, и я бы сделал xmlhttprequest, не хотите ли вы связываться с DOM, если у вас уже есть проблемы

TL; DR;Ограничьте запросы на стороне клиента и установите ограничения на сервере.window.onerror не подходит для iframes, поэтому используйте xmlhttprequest.

...