try / catch

Урок: try / catch

Введение

Когда программа работает идеально — это хорошо. Но в реальности ошибки неизбежны: пользователь вводит неправильные данные, сервер не отвечает, в коде возникает неожиданная ситуация.

Представь банкомат. Если ты вводишь неправильный PIN-код, он не «падает» и не ломается. Он просто показывает сообщение об ошибке и предлагает попробовать снова.

В программировании мы тоже хотим, чтобы приложение не ломалось при ошибках, а корректно их обрабатывало.

Для этого в JavaScript существует конструкция try / catch.

Она позволяет «поймать» ошибку и управлять тем, что будет происходить дальше.


Как работает try / catch

Конструкция try / catch позволяет перехватывать ошибки во время выполнения.

try {
  console.log("Начало");
  undefinedFunction();
  console.log("Конец");
} catch (error) {
  console.log("Произошла ошибка");
}

Результат:

Начало
Произошла ошибка

Разберём:

  • код внутри try выполняется;
  • возникает ошибка (undefinedFunction);
  • выполнение переходит в catch;
  • код после ошибки внутри try не выполняется.

Важно: программа не «падает», а продолжает работать.


Что содержит error

В блоке catch мы получаем объект ошибки.

try {
  let user = null;
  console.log(user.name);
} catch (error) {
  console.log(error);
}

Результат:

TypeError: Cannot read properties of null

Можно вывести конкретное сообщение:

try {
  let user = null;
  console.log(user.name);
} catch (error) {
  console.log(error.message);
}

Это полезно для отладки и логирования.


Как работает выполнение по шагам

Важно понимать порядок:

try {
  console.log("1");
  throw new Error("Ошибка!");
  console.log("2");
} catch (error) {
  console.log("3");
}

Результат:

1
3

Здесь:

  • сначала выполняется "1";
  • затем выбрасывается ошибка (throw);
  • код после ошибки ("2") не выполняется;
  • управление переходит в catch.

Генерация ошибки вручную (throw)

Иногда нужно создать ошибку самостоятельно.

function withdraw(balance, amount) {
  if (amount > balance) {
    throw new Error("Недостаточно средств");
  }

  return balance - amount;
}
console.log("нормальный сценарий:", withdraw(100, 50));

Использование:

try {
  withdraw(100, 200);
} catch (error) {
  console.log(error.message);
}

Результат:

Недостаточно средств

Ключевое слово throw позволяет явно сообщить об ошибке.


Блок finally

Есть ещё один блок — finally.

Он выполняется всегда, независимо от ошибки.

try {
  console.log("Начало");
} catch (error) {
  console.log("Ошибка");
} finally {
  console.log("Всегда выполняется");
}

Результат:

Начало
Всегда выполняется

finally часто используют для «очистки»:

  • закрыть соединение;
  • остановить загрузку;
  • убрать индикатор.

try / catch и асинхронность

Важно: try / catch работает только с синхронным кодом или с await.

Пример ошибки:

(async () => {
  try {
    Promise.reject("Ошибка!").catch(() => {});
  } catch (error) {
    console.log("этот catch не вызовется — reject без await");
  }
  console.log(
    "ошибка Promise ушла в микрозадачу; в уроке ниже — правильный вариант с await",
  );
})();

Этот код не сработает.

Правильный вариант:

async function main() {
  try {
    await Promise.reject("Ошибка!");
  } catch (error) {
    console.log(error);
  }
}

main();

Здесь await «превращает» асинхронную ошибку в обычную, которую можно поймать.


Когда использовать try / catch

try / catch используют, когда есть риск ошибки:

  • работа с внешними данными (API);
  • парсинг JSON;
  • доступ к вложенным данным;
  • пользовательский ввод;
  • асинхронные операции с await.

Например:

try {
  let data = JSON.parse("невалидный JSON");
} catch (error) {
  console.log("Ошибка при разборе JSON");
}

Без try / catch программа бы упала.


Когда не стоит использовать try / catch

Не стоит оборачивать весь код подряд в try / catch.

try {
  console.log("точечный try, а не весь проект");
} catch (e) {
  console.log("ошибка:", e.message);
}

Это плохая практика, потому что:

  • ошибки скрываются;
  • сложно понять, что пошло не так.

Лучше использовать try / catch точечно — там, где действительно есть риск.


Где это используется на практике

В реальных приложениях try / catch используется постоянно:

  • при запросах к серверу;
  • при обработке данных;
  • при работе с формами;
  • при взаимодействии с внешними сервисами.

Например:

  • если сервер не отвечает — показать сообщение;
  • если данные некорректны — уведомить пользователя;
  • если что-то пошло не так — не ломать интерфейс.

Итоговое понимание

try / catch — это механизм управления ошибками.

Он позволяет:

  • перехватывать ошибки;
  • контролировать поведение программы;
  • не допускать «падения» приложения.

Ключевая идея в том, что ошибки — это нормальная часть работы, и важно не избегать их, а правильно обрабатывать.

try / catch — это инструмент, который превращает ошибки из проблемы в управляемый процесс.