> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e2-exception-handling/01-try-catch-finally.md).

# 01. try-catch-finally

Исключения перехватываются с помощью обработчика `try-catch-finally`. Когда возбуждается исключение, интерпретатор JS немедленно прерывает нормальное выполнение программы и переходит к ближайшему обработчику исключений.

```javascript
try {
    ...
} catch (err) {
    ...
} finally {
    ...
}⟧
```

Работает `try-catch-finally` так:

* Выполняется код внутри блока `try`.
* Если в нём ошибок нет, то блок `catch(err)` игнорируется, то есть выполнение доходит до конца `try` и потом прыгает через `catch`.
* Если в нём возникнет ошибка, то выполнение `try` на ней прерывается, и управление прыгает в начало блока `catch(err)`.
* При этом переменная `err` (можно выбрать и другое название) будет содержать объект ошибки с подробной информацией о произошедшем.
* Если есть блок `finally`, то он срабатывает вне зависимости от того, было выброшено исключение или нет.
* И блок `catch`, и блок `finally` не являются обязательными, однако после блока `try` должен обязательно присутствовать хотя бы один из них.
* Если блок `finally` возвращает значение, то данное значение становится возвращаемым значением всей связки `try-catch-finally`. Значения, возвращаемые блоками `try` и `catch`, будут проигнорированы.

`try..catch` работает только в синхронном коде:

```javascript
try {
  setTimeout(() => throw new Error(), 1000); // throws in console
} catch (e) {
  alert("do not work");
}
```
