Files
frontend-docs/docs/javascript/07-errors/01-try-catch.md
2025-03-25 16:40:25 +03:00

4.8 KiB
Raw Permalink Blame History

sidebar_position
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

try {
   //... пробуем выполнить код...
} catch(e) {
   //... обрабатываем ошибки ...
} finally {
   //... выполняем всегда ...
}

Оператор «throw»

Оператор throw генерирует ошибку.

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, которая будет вызвана в случае необработанной ошибки.

window.onerror = function(message, url, line, col, error) {
  // ...
};
  • message - Сообщение об ошибке.
  • url - URL скрипта, в котором произошла ошибка.
  • line, col - Номера строки и столбца, в которых произошла ошибка.
  • error - Объект ошибки.

🚀 Источник: https://learn.javascript.ru/try-catch