update promises
This commit is contained in:
74
docs/javascript/07-errors/01-try-catch.md
Normal file
74
docs/javascript/07-errors/01-try-catch.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
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** - Объект ошибки.
|
||||
Reference in New Issue
Block a user