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
**In chapter 01-10-01 try-catch**
There were many mistakes.
And some of sentences were correct, but they were "unnatural" in Ukrainian and make understanding more difficult.
Copy file name to clipboardExpand all lines: 1-js/10-error-handling/1-try-catch/article.md
+27-27Lines changed: 27 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -34,7 +34,7 @@ try {
34
34
35
35
Подивімося на декілька прикладів.
36
36
37
-
- Приклад без виключень: виводить `alert``(1)` та `(2)`:
37
+
- Приклад без помилки: виводить `alert``(1)` та `(2)`:
38
38
39
39
```js run
40
40
try {
@@ -51,15 +51,15 @@ try {
51
51
52
52
}
53
53
```
54
-
- Приклад з виключенням: виводить `(1)` та `(3)`:
54
+
- Приклад з помилкою: виводить `(1)` та `(3)`:
55
55
56
56
```js run
57
57
try {
58
58
59
59
alert('Початок блоку try'); // *!*(1) <--*/!*
60
60
61
61
*!*
62
-
lalala; // помилка, змінна не визначена!
62
+
lalala; // помилка, variable is not defined!
63
63
*/!*
64
64
65
65
alert('Кінець блоку try (не буде виконано)'); // (2)
@@ -72,8 +72,8 @@ try {
72
72
```
73
73
74
74
75
-
````warn header="`try...catch` працює тільки з виключеннями, що виникають в під час роботи скрипту"
76
-
Щоб блок `try...catch` спрацював, код повинен запускатися. Іншими словами, це повинен бути валідний JavaScript.
75
+
````warn header="`try...catch` працює тільки з помилками, що виникають під час виконання скрипту"
76
+
Щоб блок `try...catch` спрацював, код повинен запускатися. Іншими словами, це повинен бути валідний JavaScript код.
77
77
78
78
Це не спрацює, якщо код містить синтаксичні помилки, як-от незакриті фігурні дужки:
79
79
@@ -87,12 +87,12 @@ try {
87
87
88
88
JavaScript рушій спочатку прочитує код і тільки потім виконує його. Помилки, що виникають у фазі читання називаються "помилки парсингу", вони не можуть бути обробленими і скрипти припиняють свою роботу. Це виникає через те, що рушій не може зрозуміти код.
89
89
90
-
Тому `try...catch` може тільки обробляти помилки, що виникають у правильному коді. Такі помилки називаються "помилки часу виконання" або "виключення".
90
+
Тому `try...catch` може тільки обробляти помилки, що виникають у правильному коді. Такі помилки називаються "помилки під час виконання"(runtime errors) або "виключення" (exceptions).
91
91
````
92
92
93
93
94
94
````warn header="`try...catch` працює синхронно"
95
-
Якщо виключення трапляється у "запланованому до виконання" коді, як `setTimeout`, тоді `try...catch` не зможе перехопити помилку:
95
+
Якщо помилка трапляється у "запланованому до виконання" коді, як от в`setTimeout`, тоді `try...catch` не зможе перехопити помилку:
96
96
97
97
```js run
98
98
try {
@@ -106,7 +106,7 @@ try {
106
106
107
107
Це відбувається через те, що функція буде виконана пізніше, коли рушій вже вийде з блоку `try...catch`.
108
108
109
-
Щоб перехопити виключення всередині функції запланованої до виконання, `try...catch` повинен бути всередині цієї функції:
109
+
Щоб перехопити помилку всередині функції запланованої до виконання, `try...catch` повинен бути всередині тієї функції:
110
110
```js run
111
111
setTimeout(function() {
112
112
try {
@@ -133,12 +133,12 @@ try {
133
133
Для всіх вбудованих помилок об’єкт помилки має дві головні властивості:
134
134
135
135
`name`
136
-
: Назва помилки. Наприклад, для невизначеної змінної назва буде `"ReferenceError"`.
136
+
: Назва помилки. До прикладу, для неоголошеної змінної назва буде `"ReferenceError"`.
137
137
138
138
`message`
139
139
: Текстове повідомлення з додатковою інформацією про помилку.
140
140
141
-
Існують інші властивості, що доступні в більшості оточень. Одна з найуживаніших та часто підтримується:
141
+
Існують інші властивості, що доступні в більшості оточень. Одна з найуживаніших та часто підтримуваних:
142
142
143
143
`stack`
144
144
: Поточний стек викликів: рядок з інформацією про послідовність вкладених викликів, що призвели до помилки. Використовується для налагодження.
@@ -155,7 +155,7 @@ try {
155
155
alert(err.message); // lalala is not defined
156
156
alert(err.stack); // ReferenceError: lalala is not defined at (...call stack)
157
157
158
-
// Також можливо вивести всю інформацію про помилку
158
+
// Також можливо вивести помилку цілком
159
159
// Помилку конвертовано в рядок формату "name: message"
160
160
alert(err); // ReferenceError: lalala is not defined
161
161
}
@@ -192,7 +192,7 @@ let json = '{"name":"Іван", "age": 30}'; // дані з серверу
192
192
let user = JSON.parse(json); // трансформуємо текстове значення в JS об’єкт
193
193
*/!*
194
194
195
-
// тепер user це об’єкт, що містить властивості з рядку
195
+
// тепер user це об’єкт, що містить властивості з рядка
196
196
alert( user.name ); // Іван
197
197
alert( user.age ); // 30
198
198
```
@@ -227,9 +227,9 @@ try {
227
227
}
228
228
```
229
229
230
-
У цьому разі блок `catch`використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонувати користувачу інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи.
230
+
Тут блок `catch`використали тільки для виведення повідомлення про помилку, але можна було зробити й інші дії: відправити новий запит, запропонувати користувачу інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи без жодних пояснень.
231
231
232
-
## Створення та викидання власних типів помилок
232
+
## Створення та вкидання наших власних помилок
233
233
234
234
Уявімо ситуацію, що `json` синтаксично правильний, але не містить необхідного поля `name`.
235
235
@@ -250,21 +250,21 @@ try {
250
250
}
251
251
```
252
252
253
-
В такому разі `JSON.parse`відпрацює без виключень, але відсутність поля `name` є помилкою з нашої точки зору.
253
+
В такому разі `JSON.parse`спрацює нормально і блок `catch` буде проігнорованим. Але з нашої точки зору в нас є помилка - відсутність поля `name`.
254
254
255
-
Ми будемо використовувати оператор `throw` для об’єднання способів обробки помилок.
255
+
Для того, щоб уніфікувати обробку помилок, ми скористаємось оператором `throw`.
256
256
257
257
### Оператор "throw"
258
258
259
-
Оператор `throw` використовується для викидання помилки.
259
+
Оператор `throw`(з англ. кидати, вкидати) використовується для вкидання помилки.
260
260
261
261
Оператор має синтаксис:
262
262
263
263
```js
264
264
throw <об’єкт помилки>
265
265
```
266
266
267
-
Рушій дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
267
+
Суто технічо рушій JavaScript дозволяє передавати будь-які значення в якості об'єкту помилки. Це може бути навіть примітивне значення, як число чи рядок. Але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
268
268
269
269
JavaScript має багато вбудованих конструкторів для вбудованих помилок: `Error`, `SyntaxError`, `ReferenceError`, `TypeError` та інші. Також вони можуть бути використаними для створення об’єктів помилок.
270
270
@@ -330,7 +330,7 @@ try {
330
330
331
331
У рядку `(*)` оператор `throw` генерує `SyntaxError` із заданим значенням поля `message`, таким же чином це зробив би JavaScript. Виконання коду в блоці `try` одразу припиняється і контроль передається в `catch`.
332
332
333
-
Тепер в блоці `catch` обробляються всі види помилок: від `JSON.parse` та інших випадків.
333
+
Тепер в блоці `catch` обробляються всі види помилок: як від `JSON.parse`, так і користувацькі.
334
334
335
335
## Повторне викидання помилок
336
336
@@ -355,7 +355,7 @@ try {
355
355
356
356
В нашому прикладі `try...catch` використовується для перехоплення помилок, що виникають у разі неповних даних. Але `catch` перехоплює *всі* типи помилок, що виникають в `try`. Тут виникає непередбачувана помилка, але все одно в повідомленні виводиться `"JSON Error"`. Це неправильна поведінка, що ускладнює налагодження.
357
357
358
-
Щоб уникати таких проблем, ми можемо використовувати підхід "повторного викидання помилок". Правило просте:
358
+
Щоб уникати таких проблем, ми можемо використовувати підхід "повторного викидання помилок" (від англ. rethrowing). Правило просте:
359
359
360
360
**Блок `catch` повинен оброблювати тільки відомі помилки та повторно генерувати всі інші типи помилок.**
361
361
@@ -491,7 +491,7 @@ try {
491
491
492
492
Блок `finally` використовується, якщо ми почали виконувати якусь роботу і хочемо завершити її в будь-якому разі.
493
493
494
-
Наприклад, ми хочемо виміряти час роботи функції, що рахує числа Фібоначчі. Для цього ми можемо почати вимірювання на початку виконання і закінчити після. А якщо протягом роботи функції виникне помилка? Зокрема, імплементація `fib(n)` нижче генерує виключення, якщо на вхід подано від’ємне або неціле число.
494
+
Наприклад, ми хочемо виміряти час роботи функції, що рахує числа Фібоначчі. Для цього ми можемо почати вимірювання на початку виконання і закінчити після. А якщо протягом роботи функції виникне помилка? Зокрема, імплементація `fib(n)` нижче генерує помилки, якщо на вхід подано від’ємне або неціле число.
495
495
496
496
Конструкція `finally` -- відмінне місце для завершення вимірювання незалежно від результату.
Якщо після запуску коду ввести в число`35`-- скрипт буде виконано без помилок, блок `finally` після блоку `try`. Але якщо ввести `-1`-- одразу буде згенеровано помилку, а виконання код займе `0ms`. Обидва вимірювання будуть проведені правильно.
529
+
Ви можете перевірити запустивши код і ввести `35` в `prompt` - спершу буде виконано `try`, і за ним `finally`. І тоді ввести `-1`, і тоді буде негайна помилка і результат дасть `0мс`. Обидвоє вимірювань будуть виконані коректно.
530
530
531
531
Інакше кажучи, функція може завершуватися або через `return`, або через `throw`, але блок `finally` буде завжди виконано.
532
532
533
533
534
534
```smart header="Змінні визначені всередині `try...catch...finally` є локальними"
535
-
Зверніть увагу, змінні `result` та `diff`, в коді вище, оголошено "перед"`try...catch`.
535
+
Зверніть увагу, змінні `result` та `diff`, в коді вище, оголошені перед `try...catch`.
536
536
537
537
Якщо ми оголосимо змінну за допомогою `let` в блоці `try`, вона залишиться видимою тільки всередині цього блоку.
538
538
```
539
539
540
540
````smart header="`finally` та `return`"
541
-
Частина`finally` виконається в *будь-якому* разі при виході з `try...catch`. Навіть якщо явно викликати `return`.
541
+
Блок `finally` виконається в *будь-якому* разі при виході з `try...catch`. Навіть якщо явно викликати `return`.
542
542
543
543
У прикладі нижче вихід з блоку `try` відбувається за допомогою `return`. Тоді блок `finally` буде виконано одразу перед поверненням виконання до зовнішнього коду.
544
544
@@ -583,7 +583,7 @@ function func() {
583
583
## Глобальний catch
584
584
585
585
```warn header="Environment-specific"
586
-
Інформація, що наведена в цій секції, не є частиною мови JavaScript.
586
+
Інформація, що наведена в цій окремої секції, не є стандартом мови JavaScript.
587
587
```
588
588
589
589
Припустимо, через помилку програміста виключення трапилося поза блоком `try...catch` і призвело до припинення роботи скрипту.
@@ -666,9 +666,9 @@ try {
666
666
- `name` -- рядок з іменем помилки (назва конструктора помилки).
667
667
- `stack` (нестандартна, але широко підтримувана) -- стек викликів на момент створення помилки.
668
668
669
-
Ми можемо пропустити отримання об’єкту помилки, якщо використати`catch {` замість `catch (err) {`.
669
+
Ми можемо пропустити отримання об’єкту помилки написавши `catch {` замість `catch (err) {`.
670
670
671
-
Також ми можемо генерувати власні помилки за допомогою оператору`throw`. Технічно, будь-що можна передати аргументом в `throw`, але, зазвичай, використовується об’єкт, успадкований від вбудованого класу `Error`. Детальніше про розширення помилок в наступному розділі.
671
+
Також ми можемо генерувати власні помилки за допомогою оператора `throw`. Технічно, будь-що можна передати аргументом в `throw`, але, зазвичай, використовується об’єкт, успадкований від вбудованого класу `Error`. Детальніше про розширення Error буде в наступному розділі.
672
672
673
673
*Повторне викидання* -- важливий шаблон в роботі з помилками: переважно блок `catch` знає як обробляти помилки певного типу, тому він повинен знову викидати невідомі типи помилок.
0 commit comments