Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Fixing typos in Try-catch article#673

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
tarasyyyk merged 1 commit intojavascript-tutorial:masterfromzioneexe:patch-2
Jan 2, 2025
Merged
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions1-js/10-error-handling/1-try-catch/article.md
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -227,7 +227,7 @@ try {
}
```

У цьому разі блок `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` гарантує, що час буде виміряно правильно як в ситуації успішного виконання, так і в разі помилки.

Expand DownExpand Up@@ -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`"
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), що виконається, коли виникне помилка.

Синтаксис:

Expand All@@ -607,7 +607,7 @@ window.onerror = function(message, url, line, col, error) {
: URL скрипту, де трапилась помилка.

`line`, `col`
:Номер рядку та колонки, де трапилась помилка.
:Номери рядку та колонки, де трапилась помилка.

`error`
: Об’єкт помилки.
Expand All@@ -632,13 +632,13 @@ window.onerror = function(message, url, line, col, error) {

Глобальний обробник `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`.

[8]ページ先頭

©2009-2025 Movatter.jp