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 — это инструмент, который превращает ошибки из проблемы в управляемый процесс.