Я ищу , чтобы начать делать свою JavaScript немного больше ошибок доказательства, и я нахожу много документации по использованию try
, catch
, finally
и throw
, но я не найти тонну советов от экспертов о том, когда и куда бросать ошибки.
- Должен ли каждый фрагмент кода быть заключен в try / catch?
- Есть ли еще такой совет о том, в какой момент следует обнаруживать ошибки?
- Есть ли недостатки в том, чтобы выдавать ошибки вместо тихого сбоя кода в производственной среде?
- Это было затронуто в SO до реализации, но есть ли эффективная стратегия регистрации ошибок JS сервера?
- Что еще мне следует знать об ошибках перехвата в моем приложении?
Я также полностью заинтересован в том, чтобы слушать книги, в которых есть отличные главы или подробные объяснения обработки ошибок. Красноречивый JavaScript затрагивает этот вопрос, но не слишком предписывающий или категоричный по этому поводу.
Спасибо за любой совет, который вы можете дать!
javascript
error-handling
Джошуа Коди
источник
источник
Ответы:
Чрезвычайно интересный набор слайдов по обработке ошибок Enterprise JavaScript можно найти по адресу http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
Вкратце он резюмирует:
Слайды содержат гораздо больше деталей и, скорее всего, дадут вам какое-то направление.
ОБНОВИТЬ
Вышеупомянутую презентацию можно найти здесь: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
источник
Николас Закас из Yahoo! fame выступил с докладом об обработке ошибок предприятия ( слайды ) на Ajax Experience 2008, в котором предложил что-то вроде этого:
Год спустя Николас Закас опубликовал в своем блоге обновление, в котором был включен умный шаблон для автоматического внедрения кода обработки ошибок в вашу производственную среду (с использованием аспектно-ориентированного программирования).
Когда вы начнете регистрировать вызовы window.error, вы заметите две вещи:
Уменьшить поток записей журнала так же просто, как проверить серьезность и / или случайное число перед входом на сервер:
Обработка бесполезных ошибок «window.error in undefined: 0» зависит от архитектуры вашего сайта, но вы можете попытаться идентифицировать все вызовы Ajax и генерировать исключение, когда что-то не удается (возможно, возвращая трассировку стека с помощью stacktrace.js ).
источник
if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {
(по общему признанию, этот код ограничивает не все ошибки, а только определенный класс ошибок тайм-аута)IHMO, вы должны использовать обработку ошибок в javascript, как и на нескольких других языках (AFAIK: Python, Java).
Для лучшей читаемости (и, возможно, лучшей производительности, хотя я не уверен, что это действительно сильно повлияет), вам следует использовать блок try / catch в основном в следующих случаях:
Часть кода, которую вы хотите обернуть, является ключевой частью всего алгоритма . В случае неудачи он может:
Вы знаете, что код, который вы пишете, совместим не со всеми браузерами.
В конце концов, у экспертов по javascript могут быть и другие элементы.
мои 2 цента в коробку,
С Уважением,
Максимум
источник
В дополнение к другим ответам: одна важная вещь - использовать контекстные данные, доступные в объектах ошибок JavaScript и в
window.onerror
параметрах функции.Такие вещи, как stacktrace (errorObject.stack), имя файла, номер строки и номер столбца. Обратите внимание, что у каждого браузера есть некоторые отличия ... так что постарайтесь получить хорошие ошибки.
Могут быть проблемы даже с самим объектом консоли . Я использую настраиваемую функцию window.onerror, вдохновленную этим, и специальную функцию для отслеживания любого заданного стандартного объекта ошибки, вдохновленного этим кодом .
Еще один хороший момент - включить версию вашего веб-приложения где-нибудь рядом с трассировкой стека (для быстрого и безопасного копирования и вставки). Вы также можете более агрессивно отображать ошибки (предупреждение ...) в режиме разработки, так как разработчики не будут постоянно следить за консолью браузера и могут не видеть некоторые проблемы.
Также используйте, избегайте использования
throw 'My message'
, используйтеthrow new Error('My message')
, вы даже можете иметь собственные ошибки, прочтите эту статью .Всегда добавляйте некоторый контекст к ошибкам (версия, идентификатор объекта, какое-то настраиваемое сообщение, ...), а также убедитесь, что вы проводите различие между внешними ошибками (некоторые внешние данные или обстоятельства привели к сбою вашей системы) и внутренними ошибками / assertions (ваша собственная система испортилась), прочтите о « Дизайн по контракту ».
Вот руководство .
Также подумайте об использовании общей обработки ошибок, такой как перехватчики ваших библиотек и фреймворков:
источник