0Pricing
TypeScript Academy · Урок

Проблема выбрасывания ошибок

Узнайте, почему исключения скрывают сбои от системы типов

«Проблема выбрасывания ошибок» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Исключения невидимы

Когда функция выполняет throw, её сигнатура этого не отражает. Система типов не видит, какие функции могут завершиться ошибкой, поэтому компилятор не побуждает вызывающий код обрабатывать ошибки.

Функция, выбрасывающая исключение

Эта функция выглядит так, будто всегда возвращает число, но может выбросить исключение. Тип возврата number полностью скрывает возможность ошибки.

function parsePort(s: string): number {
  const n = Number(s);
  if (Number.isNaN(n)) throw new Error("bad port");
  return n;
}
console.log(parsePort("8080")); // 8080

Вызывающий код забывает перехватить исключение

Ничто не вынуждает вызывающий код оборачивать вызов в try/catch. Такая ошибка без проблем компилируется и проявляется только во время выполнения в виде аварийного завершения.

const port = parsePort("oops");
// No compile error; throws at runtime, possibly crashing the app.

Перехват исключения теряет тип

Даже если вы перехватываете исключение, перехваченное значение имеет тип unknown (или any). Структура ошибки не отслеживается, поэтому обработка превращается в догадки.

try {
  parsePort("x");
} catch (e) {
  // e: unknown -> you must narrow it manually
}

Ошибки как значения

Альтернатива — сделать ошибку обычным значением, которое функция возвращает, а не исключением, которое она выбрасывает. Тогда тип возврата честно показывает оба возможных результата.

Набросок функции, возвращающей значение

Вместо выбрасывания исключения возвращайте объект с тегом, описывающий успех или ошибку. Вызывающий код должен проверить его, прежде чем использовать значение.

type ParseResult =
  | { ok: true; value: number }
  | { ok: false; error: string };

Теперь тип говорит правду

Функция, возвращающая ParseResult, сообщает, что может завершиться ошибкой. Поэтому компилятор требует от вызывающего кода обработать ветвь ошибки.

function parsePort(s: string): ParseResult {
  const n = Number(s);
  return Number.isNaN(n)
    ? { ok: false, error: "bad port" }
    : { ok: true, value: n };
}

Обязательная обработка

Поскольку значение может относиться к любой из ветвей, нельзя прочитать value, предварительно не проверив ok. Компилятор сужает тип только после этой проверки.

const r = parsePort("oops");
if (r.ok) console.log(r.value);
else console.log("failed:", r.error);

Исключения всё ещё уместны

По-настоящему неожиданные и невосстановимые сбои (ошибки программиста, нехватка памяти) по-прежнему могут выбрасывать исключения. Ошибки-значения особенно полезны для ожидаемых сбоев, например при разборе и проверке данных.

Явное лучше неявного

Возврат ошибок делает путь сбоя явным в типе, видимым в месте вызова и случайно игнорировать его уже невозможно — в отличие от скрытого throw.

К типам результата и варианта

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

Быстрая проверка

Быстрая проверка по этому уроку.

Итоги

Выброшенные ошибки невидимы для типов: сигнатуры скрывают возможность сбоя, а вызывающий код забывает перехватить исключение. Возврат ошибки как явного значения (объекта с тегом успеха или ошибки) делает путь сбоя видимым в типе и не позволяет его игнорировать, что приводит к типам результата и варианта.

Часто задаваемые вопросы

Урок «Проблема выбрасывания ошибок» бесплатный?

Да — полный текст урока «Проблема выбрасывания ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Проблема выбрасывания ошибок»?

Узнайте, почему исключения скрывают сбои от системы типов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Проблема выбрасывания ошибок»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проблема выбрасывания ошибок
  2. Моделирование типов Result
  3. Типы Option и Maybe
  4. Программирование в стиле Railway
← Назад к TypeScript Academy