Які найкращі практики роботи з помилками JavaScript?


137

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

  • Чи повинен кожен фрагмент коду бути загорнутим у спробу / ловити?
  • Чи є більше подібних порад щодо того, в який момент помилки слід виявити?
  • Чи є недоліки у виникненні помилок замість того, щоб код мовчки вийшов з ладу у виробництві?
  • Це стосувалося SO настільки, наскільки це стосується реалізацій, але чи є ефективними стратегіями JS-сервера, що ведуть реєстрацію?
  • Що-небудь ще, що я повинен знати, щодо помилок уловлювання в моїй програмі?

Я також повністю гра для слухання книг, які мають великі глави або глибокі пояснення поводження з помилками. Красномовне JavaScript торкається цього питання, але не є дуже прискіпливим чи висловленим з приводу цього питання.

Дякую за будь-яку пораду, яку ви можете дати!


Це, безумовно, залежить від того, наскільки ефектно ви не зможете, якщо щось піде не так, і кількість можливих повідомлень про помилки. Ви не хочете виходити з ладу, тому що ваш каталог журналів помилок зараз повно? - Ви тут взагалі заглядали? stackoverflow.com/search?q=error+logging+javascript
mplungjan

@mplungjan - я просканував відповіді там, але не дуже здався канонічним, і пошуки обробки помилок Javascript / виняток найкращих практик не виявили нічого, тому я подумав, що може бути корисним спробувати і попросити кілька стислих думок, як для моїх власне розуміння та майбутні шукачі. Можливо, це тема, коли призначення найкращих практик не є можливим, але кожна ситуація є унікальною?
Джошуа Коді

1
"Чи повинен кожен фрагмент коду бути загорнутим у спробу / ловити?" Звичайно, ні. Існує багато коду, який, як ви знаєте, завжди буде працювати (якщо, звичайно, ви протестуєте його, але сенс спроби / лову - це не впіймати чи помилити помилки кодування). Тільки код обертання, який може вийти з ладу через деякий час поза його контролем, як правило, такі речі, як доступ до ресурсів тощо. Є багато бібліотек, які роблять це, які вирішують проблеми між веб-браузером і дозволяють вказати функцію обробки помилок.
nnnnnn

1
Це гарне запитання Джоша, +1. Синтаксичні поради багато, але, як ви кажете, це легка частина. Це зачіпається у відповіді на це запитання ( stackoverflow.com/questions/2825427/… ), де пояснено, що винятки не так часто використовуються в JS, і наводиться причини.
Уїтніленд

Відповіді:


63

Надзвичайно цікавий набір слайдів про керування помилками Enterprise JavaScript можна знайти на веб- сайті http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/

Коротше це підсумовує:

  1. Припустимо, ваш код не вдасться
  2. Помилки журналу на сервері
  3. Ви, а не браузер, обробляєте помилки
  4. Визначте, де можуть виникнути помилки
  5. Накиньте власні помилки
  6. Розрізняють фатальні та нефатальні помилки
  7. Забезпечити режим налагодження

Слайди розглядаються набагато детальніше і, швидше за все, дадуть вам певний напрямок.

ОНОВЛЕННЯ

Згадану вище презентацію можна знайти тут: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation


24
Посилання девхандсів розірвано.
Райан Гейтс

7
Тим, хто читав це у 2017 році, я стверджую, що з слайдів ви не отримаєте великої цінності - цей підсумок дає 90% інформації. Це все ще цінна інформація. Ура!
Філіп Геберт

29

Ніколас Закас з Yahoo! слава розмовляла з поводженням з помилками підприємств ( слайдами ) на 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 у невизначених: 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 у невизначеному: 0) залежить від архітектури вашого сайту, але можна спробувати визначити всі виклики Ajax та викинути виняток, коли щось не вдається (можливо, повернення сліду стека за допомогою stacktrace.js ).


67
Я знаю, що це старе питання, але запропонувати випадково ігнорувати деякі помилки - одна з найгірших ідей, які я коли-небудь чув.
jbabey

26
@jbabey: Для невеликого сайту ви маєте рацію, але якщо ви працюєте на великому сайті зі 100 000 або мільйонами користувачів, вам дійсно не потрібно заливати ваші сервери (або Інтернет) зайвими запитами на реєстрацію. У досить великій системі кожна реальна помилка трапляється десятки тисяч разів на день, тому така форма обмеження працює просто чудово. Ідея реально реалізована у Facebook.
Єнс Роланд

1
Помилки реєстрації даних у режимі налагодження, ймовірно, настільки ж важливі, як і обмеження звітів про помилки у виробництві, тому можна зазначити, що для управління цим значенням, що обмежує поріг журналу, потрібне рішення.
frattaro

2
@NickBull я в 2011 році створив купу модулів JavaScript для Facebooks; саме там я і знайшов.
Єнс Роланд

1
@NickBull щойно перевірив мої старі файли, вони все ще були. Цю хитрість я знайшов у модулі завантажувача Facebook: if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {(правда, цей код не зменшує всіх помилок, лише певний клас помилок таймауту)
Jens Roland

7

IHMO, ви повинні використовувати помилки в JavaScript, як і в кількох інших мовах (AFAIK: Python, Java).

Для кращої читабельності (і, напевно, кращої продуктивності, хоча я не впевнений, що це має дуже великий вплив), ви повинні використовувати блок try / catch здебільшого у таких випадках:

  • Частина коду, яку потрібно обернути, є ключовою частиною всього алгоритму . Якщо це не вдасться, воно може:

    • створювати помилки в наступній частині кодів (наприклад, через відсутність var ...)
    • змусити сторінку не виглядати очікуваною (вплив на вміст або css)
    • зробити результати здаватися дивними для користувача (вплив на поведінку коду)
  • Ви знаєте, що код, який ви пишете, сумісний не з усіма браузерами

  • Ви планували, що код може вийти з ладу (тому що немає іншого способу перевірити, чи він повинен працювати, якщо ... тоді ... блоки)
  • А також коли ви хочете налагоджувати, не турбуючи кінцевого користувача

Зрештою, фахівці з JavaScript можуть надати ще й інші елементи.

мої 2 копійки в коробку,

З повагою,

Макс


1
"Частина коду, яку ви хочете завернути, є ключовою частиною всього алгоритму" - може залежати від того, як ви хочете впоратися з відмовою. Якщо ви знаєте, що немає можливості продовжувати роботу з алгоритмом при відмові, можливо, краще обернути всю справу в спробу / ловити, тому що якщо ваш спробу / ловити (напр.) Закопаний всередині вкладених циклів, це буде більше хітом для продуктивності . З іншого боку, якщо ви можете вжити деяких дій за винятком і продовжити алгоритм, тоді вам знадобиться більш чітка настройка спробувати / ловити.
nnnnnn

5

На додаток до інших відповідей: одне важливе - використовувати контекстні дані, доступні в об’єктах помилок JavaScript та в window.onerrorпараметрах функції.

Такі речі, як стек трек (errorObject.stack), ім'я файлу, номер рядка та номер стовпця. Зауважте, що кожен браузер має деякі відмінності ... тому докладайте максимум зусиль, щоб отримати приємні помилки.

Можуть бути навіть проблеми з самим об’єктом консолі . Я використовую спеціальну функцію window.onerror, натхненну цією, і спеціальну функцію для відстеження будь-якого заданого об'єкта помилок, натхненного цим кодом .

Ще одним хорошим моментом є включення версії вашого веб-додатку десь поблизу стеки (для швидкої та безпечної копіювання та вставлення). Ви також можете показувати помилки в режимі розробки більш агресивно (насторожено ...), оскільки розробники не будуть постійно контролювати консоль браузера і, можливо, не бачать деяких проблем.

Також використовуйте уникайте використання throw 'My message', використання throw new Error('My message'), навіть у вас можуть бути спеціальні помилки, читайте цю статтю .

Завжди додайте деякий контекст до помилок (версія, ідентифікатор об’єкта, деяке користувацьке повідомлення, ...), а також переконайтесь, що ви розрізняєте зовнішні помилки (деякі зовнішні дані чи обставина призвели до відмови вашої системи) та внутрішні помилки / твердження (ваша система заблокована), читайте про " Дизайн за контрактом ".

Ось довідник .

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.