You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/10-error-handling/1-try-catch/article.md
+18-18
Original file line number
Diff line number
Diff line change
@@ -227,7 +227,7 @@ try {
227
227
}
228
228
```
229
229
230
-
У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонувати користувачі інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи.
230
+
У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонувати користувачу інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи.
231
231
232
232
## Створення та викидання власних типів помилок
233
233
@@ -264,7 +264,7 @@ try {
264
264
throw <об’єкт помилки>
265
265
```
266
266
267
-
Рушії дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
267
+
Рушій дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
268
268
269
269
JavaScript має багато вбудованих конструкторів для вбудованих помилок:`Error`, `SyntaxError`, `ReferenceError`, `TypeError` та інші. Також вони можуть бути використаними для створення об’єктів помилок.
270
270
@@ -351,7 +351,7 @@ try {
351
351
}
352
352
```
353
353
354
-
Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями можуть раптово виявитися вразливими.
354
+
Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями, можуть раптово виявитися вразливими.
355
355
356
356
В нашому прикладі `try...catch` використовується для перехоплення помилок, що виникають у разі неповних даних. Але `catch` перехоплює *всі* типи помилок, що виникають в `try`. Тут виникає непередбачувана помилка, але все одно в повідомленні виводиться `"JSON Error"`. Це неправильна поведінка, що ускладнює налагодження.
357
357
@@ -374,14 +374,14 @@ try {
374
374
*!*
375
375
if (err instanceof ReferenceError) {
376
376
*/!*
377
-
alert('ReferenceError'); // "ReferenceError" помилка доступу до невизначеної змінної
377
+
alert('ReferenceError'); // "ReferenceError": помилка доступу до невизначеної змінної
378
378
}
379
379
}
380
380
```
381
381
382
382
Для визначення класу помилки можливо перевірити властивість `err.name`. Всі вбудовані помилки мають її. Також можна перевірити значення `err.constructor.name`.
383
383
384
-
В коді нижче, щоб `catch` опрацьовував тільки `SyntaxError` ми "повторно викидаємо" помилки інших типів.
384
+
У коді нижче, щоб `catch` опрацьовував тільки `SyntaxError`, ми "повторно викидаємо" помилки інших типів.
385
385
386
386
```js run
387
387
let json = '{ "age": 30 }'; // неповні дані
@@ -412,9 +412,9 @@ try {
412
412
}
413
413
```
414
414
415
-
Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch`й повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту.
415
+
Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch`і повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту.
416
416
417
-
Така поведінка блоку `catch` дає змогу перехоплювати тільки помилки, для яких передбачено правила обробки та "пропускати" решту типів помилок.
417
+
Така поведінка блоку `catch` дає змогу перехоплювати тільки ті помилки, для яких передбачено правила обробки, та "пропускати" решту типів помилок.
418
418
419
419
Приклад нижче демонструє, як реалізувати перехоплення таких помилок ще одним рівнем `try...catch`:
420
420
@@ -493,7 +493,7 @@ try {
493
493
494
494
Наприклад, ми хочемо виміряти час роботи функції, що рахує числа Фібоначчі. Для цього ми можемо почати вимірювання на початку виконання і закінчити після. А якщо протягом роботи функції виникне помилка? Зокрема, імплементація `fib(n)` нижче генерує виключення, якщо на вхід подано від’ємне або неціле число.
495
495
496
-
Конструкція `finally` відмінне місце для завершення вимірювання незалежно від результату.
496
+
Конструкція `finally`--відмінне місце для завершення вимірювання незалежно від результату.
497
497
498
498
Блок `finally` гарантує, що час буде виміряно правильно як в ситуації успішного виконання, так і в разі помилки.
Якщо після запуску коду ввести в число `35`-- скрипт буде виконано без помилок, блок `finally` після блоку `try`. Але якщо ввести `-1`-- одразу буде згенеровано помилку, а виконання код займе `0ms`. Обидва вимірювання будуть проведені правильно.
530
530
531
-
Інакше кажучи, функція може завершуватися через або `return`, або `throw`, але блок `finally` буде завжди виконано.
531
+
Інакше кажучи, функція може завершуватися або через `return`, або через`throw`, але блок `finally` буде завжди виконано.
532
532
533
533
534
534
```smart header="Змінні визначені всередині `try...catch...finally` є локальними"
535
535
Зверніть увагу, змінні `result` та `diff`, в коді вище, оголошено "перед" `try...catch`.
536
536
537
-
Якщо ми оголосимо змінну за допомогою `let` в блоці `try` вона залишиться видимою тільки всередині цього блоку.
537
+
Якщо ми оголосимо змінну за допомогою `let` в блоці `try`, вона залишиться видимою тільки всередині цього блоку.
538
538
```
539
539
540
540
````smart header="`finally` та `return`"
@@ -573,24 +573,24 @@ function func() {
573
573
try {
574
574
// ...
575
575
} finally {
576
-
// закінчити задачу навіть, якщо все раптово припинило роботу
576
+
// закінчити задачу, навіть якщо все раптово припинило роботу
577
577
}
578
578
}
579
579
```
580
-
В коді вище помилка виникає всередині `try` та завжди передається вище в стеку викликів через відсутність `catch`, але `finally` виконається до того, як потік виконання вийде з функції.
580
+
У коді вище помилка виникає всередині `try` та завжди передається вище в стеку викликів через відсутність `catch`, але `finally` виконається до того, як потік виконання вийде з функції.
581
581
````
582
582
583
583
## Глобальний catch
584
584
585
585
```warn header="Environment-specific"
586
-
Інформація, що наведено в цій секції не є частиною мови JavaScript.
586
+
Інформація, що наведена в цій секції, не є частиною мови JavaScript.
587
587
```
588
588
589
589
Припустимо, через помилку програміста виключення трапилося поза блоком `try...catch` і призвело до припинення роботи скрипту.
590
590
591
591
Як нам вчинити в такому випадку? Ми можемо логувати помилку, виводити повідомлення користувачу (переважно, користувачі не повинні бачити повідомлення про помилки) тощо.
592
592
593
-
Специфікація не згадує таку можливість, але оточення, зазвичай, надають таку функцію для зручності. Наприклад, Node.js дозволяє викликати [`process.on("uncaughtException")`](https://nodejs.org/api/process.html#process_event_uncaughtexception) для цього. В браузері можна присвоїти функцію спеціальній властивості [window.onerror](mdn:api/GlobalEventHandlers/onerror), що виконається, коли виникне помилка.
593
+
Специфікація не згадує про таку можливість, але оточення, зазвичай, надають таку функцію для зручності. Наприклад, Node.js дозволяє викликати [`process.on("uncaughtException")`](https://nodejs.org/api/process.html#process_event_uncaughtexception) для цього. У браузері можна присвоїти функцію спеціальній властивості [window.onerror](mdn:api/GlobalEventHandlers/onerror), що виконається, коли виникне помилка.
Глобальний обробник `window.onerror` не передбачений для відновлювання роботи скрипту, а тільки відправлення повідомлення про помилку розробникам.
634
634
635
-
Для логування помилок в таких випадках існують спеціальні вебсервіси:<https://errorception.com> чи <https://www.muscula.com>.
635
+
Для логування помилок у таких випадках існують спеціальні вебсервіси:<https://errorception.com> чи <https://www.muscula.com>.
636
636
637
637
Вони працюють наступним чином:
638
638
639
639
1. Розробник реєструється в сервісі та отримує JS скрипт (чи URL скрипту), який потрібно додати на сторінку.
640
640
2. Цей скрипт встановлює власну функцію в `window.onerror`.
641
-
3. Коли трапляється помилка скрипт відправляє мережевий запит до цього сервісу.
641
+
3. Коли трапляється помилка, скрипт відправляє мережевий запит до цього сервісу.
642
642
4. Розробник може зайти в сервіс та переглядати отримані помилки.
643
643
644
644
## Підсумки
@@ -672,4 +672,4 @@ try {
672
672
673
673
*Повторне викидання*-- важливий шаблон в роботі з помилками: переважно блок `catch` знає як обробляти помилки певного типу, тому він повинен знову викидати невідомі типи помилок.
674
674
675
-
Навіть, якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`.
675
+
Навіть якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`.
0 commit comments