Files
frontend-docs/docs/javascript/07-errors/01-try-catch.md
2025-03-05 16:17:27 +03:00

75 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
sidebar_position: 1
---
# Обработка ошибок, "try..catch"
Конструкция `try..catch` позволяет обрабатывать ошибки во время исполнения кода. Она позволяет запустить код и перехватить ошибки, которые могут в нём возникнуть.
Секций `catch` или `finally` может не быть, то есть более короткие конструкции `try..catch` и `try..finally` также корректны.
Объекты ошибок содержат следующие свойства:
- `message` понятное человеку сообщение.
- `name` строка с именем ошибки (имя конструктора ошибки).
- `stack` (нестандартное, но хорошо поддерживается) стек на момент ошибки.
Если объект ошибки не нужен, мы можем пропустить его, используя `catch {` вместо `catch(err) {`.
Мы можем также генерировать собственные ошибки, используя оператор `throw`. Аргументом `throw` может быть что угодно, но обычно это объект ошибки, наследуемый от встроенного класса `Error`. Подробнее о расширении ошибок см. в следующей главе.
Проброс исключения это очень важный приём обработки ошибок: блок `catch` обычно ожидает и знает, как обработать определённый тип ошибок, поэтому он должен пробрасывать дальше ошибки, о которых он не знает.
Даже если у нас нет `try..catch`, большинство сред позволяют настроить «глобальный» обработчик ошибок, чтобы ловить ошибки, которые «выпадают наружу». В браузере это window.onerror.
**`try..catch` работает синхронно**
## try…catch…finally
```js
try {
//... пробуем выполнить код...
} catch(e) {
//... обрабатываем ошибки ...
} finally {
//... выполняем всегда ...
}
```
## Оператор «throw»
Оператор throw генерирует ошибку.
```js
let json = '{ "age": 30 }'; // данные неполны
try {
let user = JSON.parse(json); // <-- выполнится без ошибок
if (!user.name) {
throw new SyntaxError("Данные неполны: нет имени"); // (*)
}
alert( user.name );
} catch(e) {
alert( "JSON Error: " + e.message ); // JSON Error: Данные неполны: нет имени
}
```
## Проброс исключения
Блок `catch` должен обрабатывать только те ошибки, которые ему известны, и «пробрасывать» все остальные.
Техника «проброс исключения» выглядит так:
1. Блок `catch` получает все ошибки.
2. В блоке `catch(err) {...}` мы анализируем объект ошибки `err`.
3. Если мы не знаем как её обработать, тогда делаем `throw err`.
## Глобальный catch
Давайте представим, что произошла фатальная ошибка (программная или что-то ещё ужасное) снаружи try..catch, и скрипт упал.
Существует ли способ отреагировать на такие ситуации? Мы можем захотеть залогировать ошибку, показать что-то пользователю (обычно они не видят сообщение об ошибке) и т.д.
В Node.js для этого есть process.on("uncaughtException"). А в браузере мы можем присвоить функцию специальному свойству window.onerror, которая будет вызвана в случае необработанной ошибки.
```js
window.onerror = function(message, url, line, col, error) {
// ...
};
```
- **message** - Сообщение об ошибке.
- **url** - URL скрипта, в котором произошла ошибка.
- **line**, col - Номера строки и столбца, в которых произошла ошибка.
- **error** - Объект ошибки.