--- 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** - Объект ошибки. 🚀 **Источник: [https://learn.javascript.ru/try-catch](https://learn.javascript.ru/try-catch)**