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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонуватикористувачі інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи.
У цьому разі блок `catch` використано тільки для виведення повідомлення про помилку, але може бути використаним іншим чином: відправити новий запит, запропонуватикористувачу інші опції, відправити інформацію про помилку для логування та ін. Будь-який спосіб використання краще, ніж раптове припинення роботи.
## Створення та викидання власних типів помилок
Expand DownExpand Up
@@ -264,7 +264,7 @@ try {
throw <об’єкт помилки>
```
Рушії дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
Рушій дозволяє використовувати будь-які значення як об’єкти помилки. Це може бути навіть примітивне значення, як число чи рядок, але краще використовувати об’єкти, що мають властивості `name` та `message` (для сумісності з вбудованим типом помилок).
JavaScript має багато вбудованих конструкторів для вбудованих помилок: `Error`, `SyntaxError`, `ReferenceError`, `TypeError` та інші. Також вони можуть бути використаними для створення об’єктів помилок.
Expand DownExpand Up
@@ -351,7 +351,7 @@ try {
}
```
Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями можуть раптово виявитися вразливими.
Звичайно таке можливо! Програмісти теж помиляються. Навіть програми з відкритим кодом, що використовуються десятиріччями, можуть раптово виявитися вразливими.
В нашому прикладі `try...catch` використовується для перехоплення помилок, що виникають у разі неповних даних. Але `catch` перехоплює *всі* типи помилок, що виникають в `try`. Тут виникає непередбачувана помилка, але все одно в повідомленні виводиться `"JSON Error"`. Це неправильна поведінка, що ускладнює налагодження.
Expand All
@@ -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 }'; // неповні дані
Expand DownExpand Up
@@ -412,9 +412,9 @@ try {
}
```
Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch`й повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту.
Помилка, що виникає в рядку `(*)`, не проходить перевірку в блоці `catch`і повторно викидається. Виключення, після повторної генерації, може знову бути перехопленим конструкцією `try...catch` (якщо вона існує) або призведе до аварійного припинення роботи скрипту.
Така поведінка блоку `catch` дає змогу перехоплювати тільки помилки, для яких передбачено правила обробки та "пропускати" решту типів помилок.
Така поведінка блоку `catch` дає змогу перехоплювати тількитіпомилки, для яких передбачено правила обробки, та "пропускати" решту типів помилок.
Приклад нижче демонструє, як реалізувати перехоплення таких помилок ще одним рівнем `try...catch`:
Expand DownExpand Up
@@ -493,7 +493,7 @@ try {
Наприклад, ми хочемо виміряти час роботи функції, що рахує числа Фібоначчі. Для цього ми можемо почати вимірювання на початку виконання і закінчити після. А якщо протягом роботи функції виникне помилка? Зокрема, імплементація `fib(n)` нижче генерує виключення, якщо на вхід подано від’ємне або неціле число.
Конструкція `finally` відмінне місце для завершення вимірювання незалежно від результату.
Конструкція `finally`--відмінне місце для завершення вимірювання незалежно від результату.
Блок `finally` гарантує, що час буде виміряно правильно як в ситуації успішного виконання, так і в разі помилки.
Якщо після запуску коду ввести в число `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`"
Expand DownExpand Up
@@ -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), що виконається, коли виникне помилка.
Глобальний обробник `window.onerror` не передбачений для відновлювання роботи скрипту, а тільки відправлення повідомлення про помилку розробникам.
Для логування помилокв таких випадках існують спеціальні вебсервіси: <https://errorception.com> чи <https://www.muscula.com>.
Для логування помилоку таких випадках існують спеціальні вебсервіси: <https://errorception.com> чи <https://www.muscula.com>.
Вони працюють наступним чином:
1. Розробник реєструється в сервісі та отримує JS скрипт (чи URL скрипту), який потрібно додати на сторінку.
2. Цей скрипт встановлює власну функцію в `window.onerror`.
3. Коли трапляється помилка скрипт відправляє мережевий запит до цього сервісу.
3. Коли трапляється помилка, скрипт відправляє мережевий запит до цього сервісу.
4. Розробник може зайти в сервіс та переглядати отримані помилки.
## Підсумки
Expand DownExpand Up
@@ -672,4 +672,4 @@ try {
*Повторне викидання* -- важливий шаблон в роботі з помилками: переважно блок `catch` знає як обробляти помилки певного типу, тому він повинен знову викидати невідомі типи помилок.
Навіть, якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`.
Навіть якщо ми не використовуємо `try...catch`, більшість середовищ дозволяють встановити "глобальний" обробник помилок. В браузерах це `window.onerror`.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.