Skip to content
Prev Previous commit
Next Next commit
Improvments
  • Loading branch information
Purusah committed Nov 30, 2021
commit 488e6d277e9730758233a36fc06813a7206878d7
38 changes: 18 additions & 20 deletions 1-js/10-error-handling/1-try-catch/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@
* приклади коду
* зображення

* слово "виключення" не використовував доки воно не згадане вперше в англійській версії

# Робота з помилками, "try...catch"

На скільки чудовими програмістами ми б не були, але часом трапляється, що в роботі наших скрипів можуть виникати виключні ситуації. Вони виникають через наші помилки (!!!), непередбачувані вхідні дані від користувачів, помилкові відповіді від сервера або з тисяч інших причин.
На скільки чудовими програмістами ми б не були, але часом трапляється, що в роботі наших скрипів можуть виникати виключні ситуації. Вони виникають через наші помилки, непередбачувані вхідні дані від користувачів, неправильні відповіді від сервера або з тисяч інших причин.
Comment thread
tarasyyyk marked this conversation as resolved.
Outdated

Якщо виникають помилки, то скрипти, зазвичай, "помирають" (раптово зупиняються), виводячи інформацію про помилку в консоль.
Якщо виникають помилки, то скрипти, зазвичай, "помирають" (раптово припиняють роботу) та виводять інформацію про помилку в консоль.

Але існує синтаксична конструкція `try...catch`, що дозволяє нам "перехоплювати" помилки, це дає змогу скриптам виконати потрібні дії, а не раптово припинити роботу.
Але існує синтаксична конструкція `try...catch`, що дозволяє нам "перехоплювати" помилки, що дає змогу скриптам виконати потрібні дії, а не раптово припинити роботу.

## "try...catch" синтаксис
## Синтаксис "try...catch"

Конструкція `try...catch` містить два головних блоки: `try`, а потім `catch`:

Expand All @@ -30,9 +28,9 @@ try {

Це працює наступним чином:

1. В першу чергу виконується код в `try {...}`.
2. Якщо не виникає помилок, то блок `catch (err)` ігнорується: виконання досягає кінця `try` блоку та продовжується поза `catch` блоком.
3. Якщо виникає помилка, тоді виконання в `try` припиняється, and control flows to the beginning of `catch (err)`. The `err` variable (we can use any name for it) will contain an error object with details about what happened.
1. В першу чергу виконується код в блоці `try {...}`.
2. Якщо не виникає помилок, то блок `catch (err)` ігнорується: виконання досягає кінця блоку `try` та продовжується поза `catch` блоком.
Comment thread
tarasyyyk marked this conversation as resolved.
Outdated
3. Якщо виникає помилка, тоді виконання в `try` припиняється і виконання коду продовжується з початку `catch (err)` блоку. Змінна `err` (можна обрати інше ім'я) буде містити об'єкт помилки з додатковою інформацією.

![](try-catch-flow.svg)

Expand Down Expand Up @@ -81,7 +79,7 @@ try {
````warn header="`try...catch` працює тільки з виключеннями, що виникають в під час роботи скрипту"
Щоб блок `try...catch` спрацював, код повинен запускатися. Іншими словами, це повинен бути валідний JavaScript.

Це не спрацює, якщо код містить синтаксичні помилки, наприклад незакриті фігурні дужки:
Це не спрацює, якщо код містить синтаксичні помилки, як-от незакриті фігурні дужки:

```js run
try {
Expand All @@ -91,14 +89,14 @@ try {
}
```

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

Тому `try...catch` може тільки обробляти помилки, що виникають у правильному коді.Такі помилки називаються "помилки часу виконання" або "виключення".
Тому `try...catch` може тільки обробляти помилки, що виникають у правильному коді. Такі помилки називаються "помилки часу виконання" або "виключення".
````


````warn header="`try...catch` працює синхронно"
Якщо виключення трапляється у коді, що "заплановано до виконання", як `setTimeout`, тоді `try...catch` не зможе перехопити помилку:
Якщо виключення трапляється у "запланованому до виконання" коді, як `setTimeout`, тоді `try...catch` не зможе перехопити помилку:

```js run
try {
Expand All @@ -112,7 +110,7 @@ try {

Це відбувається через те, що функція буде виконана пізніше, коли рушій вже вийде з блоку `try...catch`.

Щоб перехопити виключення всередині функції, що заплановано до виконання, `try...catch` повинен бути всередині цієї функції:
Щоб перехопити виключення всередині функції запланованої до виконання, `try...catch` повинен бути всередині цієї функції:
```js run
setTimeout(function() {
try {
Expand Down Expand Up @@ -197,10 +195,10 @@ try {
let json = '{"name":"Іван", "age": 30}'; // дані з серверу

*!*
let user = JSON.parse(json); // трансформуємо текстове значення в JS об'єкт
let user = JSON.parse(json); // трансформуємо текстове значення в JS об’єкт
*/!*

// тепер user це об'єкт, що містить властивості з рядку
// тепер user це об’єкт, що містить властивості з рядку
alert( user.name ); // Іван
alert( user.age ); // 30
```
Expand All @@ -213,7 +211,7 @@ alert( user.age ); // 30

Користувач ніколи не дізнається якщо з даними щось трапилося (якщо не відкриє консоль розробника). Люди не очікують, що щось раптово може припинити роботу без будь-якої інформації про помилку.

Щоб обробити помилку використаймо `try...catch`:
Для оброблення помилки використаймо `try...catch`:

```js run
let json = "{ неправильний формат json }";
Expand Down Expand Up @@ -297,7 +295,7 @@ alert(error.name); // Error
alert(error.message); // Щось трапилось o_O
```

Подивімося на тип помилки, що згенерує `JSON.parse`:
Подивімося на тип помилки згенерований функцією `JSON.parse`:

```js run
try {
Expand Down Expand Up @@ -355,7 +353,7 @@ try {
// ...
} catch (err) {
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
// (але перехоплена помилка не пов'язана з JSON Error)
// (але перехоплена помилка не пов’язана з JSON Error)
}
```

Expand All @@ -370,7 +368,7 @@ try {
Розгляньмо підхід "повторного викидання" покроково:

1. Конструкція `catch` перехоплює всі помилки.
2. В блоці `catch (err) {...}` ми аналізуємо об'єкт помилки `err`.
2. В блоці `catch (err) {...}` ми аналізуємо об’єкт помилки `err`.
3. Якщо ми не знаємо як правильно обробити помилку, ми робимо `throw err`.

Зазвичай, тип помилки можна перевірити за допомогою оператора `instanceof`:
Expand Down