diff --git a/1-js/10-error-handling/1-try-catch/article.md b/1-js/10-error-handling/1-try-catch/article.md index 8317858eb..086cf0a2f 100644 --- a/1-js/10-error-handling/1-try-catch/article.md +++ b/1-js/10-error-handling/1-try-catch/article.md @@ -227,7 +227,7 @@ try { } ``` -У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонувати користувачі інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи. +У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонувати користувачу інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи. ## Створення та викидання власних типів помилок @@ -264,7 +264,7 @@ try { throw <об’єкт помилки> ``` -Рушії дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок). +Рушій дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок). JavaScript має багато вбудованих конструкторів для вбудованих помилок: `Error`, `SyntaxError`, `ReferenceError`, `TypeError` та інші. Також вони можуть бути використаними для створення об’єктів помилок. @@ -351,7 +351,7 @@ try { } ``` -Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями можуть раптово виявитися вразливими. +Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями, можуть раптово виявитися вразливими. В нашому прикладі `try...catch` використовується для перехоплення помилок, що виникають у разі неповних даних. Але `catch` перехоплює *всі* типи помилок, що виникають в `try`. Тут виникає непередбачувана помилка, але все одно в повідомленні виводиться `"JSON Error"`. Це неправильна поведінка, що ускладнює налагодження. @@ -374,14 +374,14 @@ try { *!* if (err instanceof ReferenceError) { */!* - alert('ReferenceError'); // "ReferenceError" помилка доступу до невизначеної змінної + alert('ReferenceError'); // "ReferenceError": помилка доступу до невизначеної змінної } } ``` Для визначення класу помилки можливо перевірити властивість `err.name`. Всі вбудовані помилки мають її. Також можна перевірити значення `err.constructor.name`. -В коді нижче, щоб `catch` опрацьовував тільки `SyntaxError` ми "повторно викидаємо" помилки інших типів. +У коді нижче, щоб `catch` опрацьовував тільки `SyntaxError`, ми "повторно викидаємо" помилки інших типів. ```js run let json = '{ "age": 30 }'; // неповні дані @@ -412,9 +412,9 @@ try { } ``` -Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch` й повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту. +Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch` і повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту. -Така поведінка блоку `catch` дає змогу перехоплювати тільки помилки, для яких передбачено правила обробки та "пропускати" решту типів помилок. +Така поведінка блоку `catch` дає змогу перехоплювати тільки ті помилки, для яких передбачено правила обробки, та "пропускати" решту типів помилок. Приклад нижче демонструє, як реалізувати перехоплення таких помилок ще одним рівнем `try...catch`: @@ -493,7 +493,7 @@ try { Наприклад, ми хочемо виміряти час роботи функції, що рахує числа Фібоначчі. Для цього ми можемо почати вимірювання на початку виконання і закінчити після. А якщо протягом роботи функції виникне помилка? Зокрема, імплементація `fib(n)` нижче генерує виключення, якщо на вхід подано від’ємне або неціле число. -Конструкція `finally` відмінне місце для завершення вимірювання незалежно від результату. +Конструкція `finally` -- відмінне місце для завершення вимірювання незалежно від результату. Блок `finally` гарантує, що час буде виміряно правильно як в ситуації успішного виконання, так і в разі помилки. @@ -528,13 +528,13 @@ alert( `виконання тривало ${diff}мс` ); Якщо після запуску коду ввести в число `35` -- скрипт буде виконано без помилок, блок `finally` після блоку `try`. Але якщо ввести `-1` -- одразу буде згенеровано помилку, а виконання код займе `0ms`. Обидва вимірювання будуть проведені правильно. -Інакше кажучи, функція може завершуватися через або `return`, або `throw`, але блок `finally` буде завжди виконано. +Інакше кажучи, функція може завершуватися або через `return`, або через `throw`, але блок `finally` буде завжди виконано. ```smart header="Змінні визначені всередині `try...catch...finally` є локальними" Зверніть увагу, змінні `result` та `diff`, в коді вище, оголошено "перед" `try...catch`. -Якщо ми оголосимо змінну за допомогою `let` в блоці `try` вона залишиться видимою тільки всередині цього блоку. +Якщо ми оголосимо змінну за допомогою `let` в блоці `try`, вона залишиться видимою тільки всередині цього блоку. ``` ````smart header="`finally` та `return`" @@ -573,24 +573,24 @@ function func() { try { // ... } finally { - // закінчити задачу навіть, якщо все раптово припинило роботу + // закінчити задачу, навіть якщо все раптово припинило роботу } } ``` -В коді вище помилка виникає всередині `try` та завжди передається вище в стеку викликів через відсутність `catch`, але `finally` виконається до того, як потік виконання вийде з функції. +У коді вище помилка виникає всередині `try` та завжди передається вище в стеку викликів через відсутність `catch`, але `finally` виконається до того, як потік виконання вийде з функції. ```` ## Глобальний catch ```warn header="Environment-specific" -Інформація, що наведено в цій секції не є частиною мови JavaScript. +Інформація, що наведена в цій секції, не є частиною мови JavaScript. ``` Припустимо, через помилку програміста виключення трапилося поза блоком `try...catch` і призвело до припинення роботи скрипту. Як нам вчинити в такому випадку? Ми можемо логувати помилку, виводити повідомлення користувачу (переважно, користувачі не повинні бачити повідомлення про помилки) тощо. -Специфікація не згадує таку можливість, але оточення, зазвичай, надають таку функцію для зручності. Наприклад, Node.js дозволяє викликати [`process.on("uncaughtException")`](https://nodejs.org/api/process.html#process_event_uncaughtexception) для цього. В браузері можна присвоїти функцію спеціальній властивості [window.onerror](mdn:api/GlobalEventHandlers/onerror), що виконається, коли виникне помилка. +Специфікація не згадує про таку можливість, але оточення, зазвичай, надають таку функцію для зручності. Наприклад, Node.js дозволяє викликати [`process.on("uncaughtException")`](https://nodejs.org/api/process.html#process_event_uncaughtexception) для цього. У браузері можна присвоїти функцію спеціальній властивості [window.onerror](mdn:api/GlobalEventHandlers/onerror), що виконається, коли виникне помилка. Синтаксис: @@ -607,7 +607,7 @@ window.onerror = function(message, url, line, col, error) { : URL скрипту, де трапилась помилка. `line`, `col` -: Номер рядку та колонки, де трапилась помилка. +: Номери рядку та колонки, де трапилась помилка. `error` : Об’єкт помилки. @@ -632,13 +632,13 @@ window.onerror = function(message, url, line, col, error) { Глобальний обробник `window.onerror` не передбачений для відновлювання роботи скрипту, а тільки відправлення повідомлення про помилку розробникам. -Для логування помилок в таких випадках існують спеціальні вебсервіси: чи . +Для логування помилок у таких випадках існують спеціальні вебсервіси: чи . Вони працюють наступним чином: 1. Розробник реєструється в сервісі та отримує JS скрипт (чи URL скрипту), який потрібно додати на сторінку. 2. Цей скрипт встановлює власну функцію в `window.onerror`. -3. Коли трапляється помилка скрипт відправляє мережевий запит до цього сервісу. +3. Коли трапляється помилка, скрипт відправляє мережевий запит до цього сервісу. 4. Розробник може зайти в сервіс та переглядати отримані помилки. ## Підсумки @@ -672,4 +672,4 @@ try { *Повторне викидання* -- важливий шаблон в роботі з помилками: переважно блок `catch` знає як обробляти помилки певного типу, тому він повинен знову викидати невідомі типи помилок. -Навіть, якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`. +Навіть якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`.