Каковы наилучшие методы обработки ошибок JavaScript?
Я ищу, чтобы сделать мой JavaScript немного более стойким к ошибкам, и я нахожу много документации по использованию try
, catch
, finally
и throw
, но я не нахождение тонны советов экспертов о том, когда и где делать ошибки.
- Если каждый фрагмент кода будет завернут в try/catch?
- Есть ли еще советы, такие как this on, в какой момент ошибки должны быть пойманы?
- Есть ли недостатки в повышении ошибок, а не в том, что код не работает в режиме молчания?
- Это было затронуто на SO по мере реализации, но имеют ли серверные протоколы JS ошибки эффективную стратегию?
- Что-нибудь еще, что я должен знать, относительно ошибок захвата в моем приложении?
Я также полностью играю за слух о книгах, которые имеют большие главы или подробные объяснения ошибок обработки. Красноречивый JavaScript затрагивает этот вопрос, но не очень предписывает или усомнился в этом.
Спасибо за любой совет, который вы можете дать!
Ответы
Ответ 1
Необычайно интересный набор слайдов в Enterprise JavaScript Error Handling можно найти на http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
Вкратце он суммирует:
- Предположим, что ваш код не будет работать.
- Ошибка журнала на сервере
- Вы, а не браузер, обрабатываете ошибки
- Определите, где могут возникнуть ошибки.
- Бросьте свои собственные ошибки.
- Различать смертельные и нефатальные ошибки
- Предоставить режим отладки
Слайды идут гораздо более подробно и, скорее всего, дадут вам какое-то направление.
ОБНОВЛЕНИЕ
Вышеупомянутое выступление можно найти здесь:
http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
Ответ 2
Николас Закас из Yahoo! слава побеседовала с Enterprise Error Handling (слайды) в Ajax Experience 2008, в которой он предложил что-то вроде этого:
function log(sev,msg) {
var img = new Image();
img.src = "log.php?sev=" +
encodeURIComponent(sev) +
"&msg=" + encodeURIComponent(msg);
}
// usage
log(1, "Something bad happened.")
// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
log(1, msg);
return true;
}
Через год Николас Закас опубликовал в своем блоге обновление, в котором был умный образец, который автоматически вводил код обработки ошибок в вашу производственную среду (используя аспектно-ориентированное программирование).
Когда вы начинаете регистрировать вызовы window.error, вы заметите две вещи:
- Если ваш сайт довольно сложный, вы будете регистрировать множество ошибок
- Вы увидите кучу бесполезных сообщений "window.error in undefined: 0"
Сокращение потока записей журнала так же просто, как тестирование на серьезность и/или случайное число до входа на сервер:
function log(sev,msg) {
if (Math.random() > 0.1) return; // only log some errors
var img = new Image();
img.src = "log.php?sev=" +
encodeURIComponent(sev) +
"&msg=" + encodeURIComponent(msg);
}
Обработка бесполезных ошибок "window.error in undefined: 0" зависит от архитектуры вашего сайта, но может попытаться идентифицировать все вызовы Ajax и выбросить исключение, если что-то не удается (возможно, возвращая трассировку стека с использованием stacktrace.js).
Ответ 3
IHMO, вы должны использовать обработку ошибок в javascript, как на нескольких других языках (AFAIK: Python, Java).
Для лучшей читаемости (и, вероятно, лучшей производительности, хотя я не уверен, что это действительно сильно влияет), вы должны использовать блок try/catch в основном в следующих случаях:
-
Часть кода, которую вы хотите обернуть, представляет собой ключевую часть всего алгоритма. Если он терпит неудачу, он может:
- создать ошибки в следующей части кода (например, потому что отсутствует var)...
- чтобы страница выглядела не так, как ожидалось (влияние на контент или css)
- сделать результаты кажущимися странными для пользователя (влияние на поведение кода)
-
Вы знаете, что код, который вы пишете, не совместим с каждым браузером
- Вы планировали, что код может выйти из строя (потому что нет другого способа проверить, что он должен работать, если... then... blocks)
- А также, если вы хотите отлаживать, не беспокоя конечного пользователя
В конце концов, эксперты javascript могут иметь другие элементы.
мои 2 цента к коробке,
Привет,
Max
Ответ 4
В дополнение к другим ответам: одна важная вещь - использовать контекстные данные, доступные в объектах ошибки JavaScript и в параметрах функции window.onerror
.
Такие вещи, как stacktrace (errorObject.stack), имя файла, номер строки и номер столбца.
Обратите внимание, что у каждого браузера есть некоторые отличия... так что приложите все усилия, чтобы получить хорошие ошибки.
Проблемы с самим коннектором могут даже возникнуть..
Я использую настраиваемую функцию window.onerror, вдохновленную этим, и специальную функцию для отслеживания любого заданного стандартного объекта ошибки, вдохновленного этот код.
Еще один хороший момент - включить версию вашего веб-приложения где-то рядом с stacktrace (для быстрой и безопасной копирования и вставки). Вы также можете показывать ошибки более агрессивно (alert...) в режиме разработки, так как разработчики не будут постоянно контролировать консоль браузера и могут не видеть некоторые проблемы.
Также избегайте использования throw 'My message'
, используйте throw new Error('My message')
, вы можете даже создать пользовательские ошибки, прочитайте эту статью.
Всегда добавляйте некоторый контекст к ошибкам (версия, идентификатор объекта, какое-то пользовательское сообщение и т.д.), а также убедитесь, что вы проводите различие между внешними ошибками (некоторые внешние данные или сила заставили вашу систему сбой) и внутренние ошибки/утверждения (ваша собственная система испортилась), читайте о Дизайн по контракту.
Вот руководство.
Также подумайте об использовании общей обработки ошибок, например, перехватчиков ваших библиотек и фреймворков:
Ответ 5
Не относится к Javascript, но этот разговор о построении отказоустойчивых систем может быть актуален
https://www.youtube.com/watch?v=TTM_b7EJg5E