|
| 1 | +# Вловлювання необроблених відхилень промісів |
| 2 | + |
| 3 | +### Пояснення за один абзац |
| 4 | + |
| 5 | +Зазвичай, більша частина коду сучасних додатків Node.js/Express виконується у межах промісів – чи то в рамках обробника .then, зворотного виклику функції або у блоку catch. Дивно, але якщо розробник забуває додати .catch, помилки, кинуті в цих місцях, не обробляються подією uncaughtException і зникають. Нещодавні версії Node запровадили повідомлення про попередження, коли з'являється необроблене відхилення, хоча це й може допомогти помітити, коли щось пішло не так, але це очевидно не належний метод обробки помилок. Просте рішення – ніколи не забувати додавати .catch в кожен виклик ланцюга промісів та перенаправляти їх до централізованого обробника помилок. Однак, побудова стратегії обробки помилок тільки на дисципліні розробників є дещо крихкою. Тому настійно рекомендується використовувати елегантне відступне рішення та підписатись на `process.on('unhandledRejection', callback)` – це гарантує, що будь-яка помилка проміса, якщо її не оброблено локально, буде відповідно оброблена. |
| 6 | + |
| 7 | +### Приклад коду: ці помилки не будуть піймані жодним обробником помилок (крім unhandledRejection) |
| 8 | + |
| 9 | +```javascript |
| 10 | +DAL.getUserById(1).then((johnSnow) => { |
| 11 | + // ця помилка просто зникне |
| 12 | + if(johnSnow.isAlive === false) |
| 13 | + throw new Error('ahhhh'); |
| 14 | +}); |
| 15 | +``` |
| 16 | + |
| 17 | +### Приклад коду: Вловлювання нерозв'язаних та відхилених промісів |
| 18 | + |
| 19 | +<details> |
| 20 | +<summary><strong>Javascript</strong></summary> |
| 21 | + |
| 22 | +```javascript |
| 23 | +process.on('unhandledRejection', (reason, p) => { |
| 24 | + // Я щойно піймав необроблене відхилення проміса, |
| 25 | + // оскільки у нас вже є відступний обробник для необроблених помилок (дивіться нижче), |
| 26 | + // давайте кинемо його та дозволимо йому впоратися з цим |
| 27 | + throw reason; |
| 28 | +}); |
| 29 | + |
| 30 | +process.on('uncaughtException', (error) => { |
| 31 | + // Я щойно отримав помилку, яка ніколи не була оброблена, час впоратися з нею, а потім вирішити, чи потрібен перезапуск |
| 32 | + errorManagement.handler.handleError(error); |
| 33 | + if (!errorManagement.handler.isTrustedError(error)) |
| 34 | + process.exit(1); |
| 35 | +}); |
| 36 | +``` |
| 37 | +</details> |
| 38 | + |
| 39 | +<details> |
| 40 | +<summary><strong>Typescript</strong></summary> |
| 41 | + |
| 42 | +```typescript |
| 43 | +process.on('unhandledRejection', (reason: string, p: Promise<any>) => { |
| 44 | + // Я щойно піймав необроблене відхилення проміса, |
| 45 | + // оскільки у нас вже є відступний обробник для необроблених помилок (дивіться нижче), |
| 46 | + // давайте кинемо його та дозволимо йому впоратися з цим |
| 47 | + throw reason; |
| 48 | +}); |
| 49 | + |
| 50 | +process.on('uncaughtException', (error: Error) => { |
| 51 | + // Я щойно отримав помилку, яка ніколи не була оброблена, час впоратися з нею, а потім вирішити, чи потрібен перезапуск |
| 52 | + errorManagement.handler.handleError(error); |
| 53 | + if (!errorManagement.handler.isTrustedError(error)) |
| 54 | + process.exit(1); |
| 55 | +}); |
| 56 | +``` |
| 57 | +</details> |
| 58 | + |
| 59 | +### Цитата з блогу: "Якщо ви можете зробити помилку, то в якийсь момент ви її зробите" |
| 60 | + |
| 61 | +З блогу Джеймса Нельсона |
| 62 | + |
| 63 | +> Давайте перевіримо ваше розуміння. Які з наступних варіантів, на вашу думку, мають вивести помилку в консоль? |
| 64 | +
|
| 65 | +```javascript |
| 66 | +Promise.resolve('обіцяне значення').then(() => { |
| 67 | + throw new Error('помилка'); |
| 68 | +}); |
| 69 | + |
| 70 | +Promise.reject('значення помилки').catch(() => { |
| 71 | + throw new Error('помилка'); |
| 72 | +}); |
| 73 | + |
| 74 | +new Promise((resolve, reject) => { |
| 75 | + throw new Error('помилка'); |
| 76 | +}); |
| 77 | +``` |
| 78 | + |
| 79 | +> Не знаю як ви, але я очікував би, що всі вони виведуть помилку. Однак, насправді, багато сучасних JavaScript-середовищ не виведуть помилки для жодного з них. Проблема з тим, що бути людиною означає, що якщо ви можете зробити помилку, то в якийсь момент ви її зробите. За таких обставин здається очевидним, що ми повинні проектувати речі таким чином, щоб помилки завдавали якомога менше шкоди, і це означає обробку помилок за замовчуванням, а не їх відкидання. |
0 commit comments