Skip to content

Commit c2829fd

Browse files
author
Serhii Shramko
committed
feat: add catchunhandledpromiserejection.ukrainian.md
1 parent 7230786 commit c2829fd

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

README.ukrainian.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,13 @@ Read in a different language: [![CN](./assets/flags/CN.png)**CN**](./README.chin
364364

365365
<br/><br/>
366366

367-
## ![] 2.10 Catch unhandled promise rejections
367+
## ![] 2.10 Перехоплення необроблених відхилень промісів
368368

369-
**TL;DR:** Any exception thrown within a promise will get swallowed and discarded unless a developer didn’t forget to explicitly handle it. Even if your code is subscribed to `process.uncaughtException`! Overcome this by registering to the event `process.unhandledRejection`
369+
**Коротко:** Будь-яке виключення, кинуте у промісі, буде проігнороване і втрачене, якщо розробник не забуде явно його обробити. Навіть якщо ваш код підписаний на `process.uncaughtException`! Перемогти це можна, зареєструвавшись на подію `process.unhandledRejection`.
370370

371-
**Otherwise:** Your errors will get swallowed and leave no trace. Nothing to worry about
371+
**В іншому випадку:** Ваші помилки будуть проігноровані та залишаться безслідними. Нічого страшного.
372372

373-
🔗 [**Read More: catching unhandled promise rejection**](./sections/errorhandling/catchunhandledpromiserejection.md)
373+
🔗 [**Читати більше: перехоплення необроблених відхилень промісів**](./sections/errorhandling/catchunhandledpromiserejection.ukrainian.md)
374374

375375
<br/><br/>
376376

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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

Comments
 (0)