Подтвердить что ты не робот

Каковы наилучшие методы обработки ошибок JavaScript?

Я ищу, чтобы сделать мой JavaScript немного более стойким к ошибкам, и я нахожу много документации по использованию try, catch, finally и throw, но я не нахождение тонны советов экспертов о том, когда и где делать ошибки.

  • Если каждый фрагмент кода будет завернут в try/catch?
  • Есть ли еще советы, такие как this on, в какой момент ошибки должны быть пойманы?
  • Есть ли недостатки в повышении ошибок, а не в том, что код не работает в режиме молчания?
  • Это было затронуто на SO по мере реализации, но имеют ли серверные протоколы JS ошибки эффективную стратегию?
  • Что-нибудь еще, что я должен знать, относительно ошибок захвата в моем приложении?

Я также полностью играю за слух о книгах, которые имеют большие главы или подробные объяснения ошибок обработки. Красноречивый JavaScript затрагивает этот вопрос, но не очень предписывает или усомнился в этом.

Спасибо за любой совет, который вы можете дать!

4b9b3361

Ответ 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, вы заметите две вещи:

  1. Если ваш сайт довольно сложный, вы будете регистрировать множество ошибок
  2. Вы увидите кучу бесполезных сообщений "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