Перейти к основному содержимому

Исключения и обработка ошибок в читаемом коде

Разработчику
Теория данных (раздел 3)

Структуры в коде — Структуры данных; persistence — ORM.

Тема дополняет быстрый провал и отказ от null: ошибка — часть контракта, а не побочный if с магическим кодом возврата.

Классика Мартина (Clean Code) и практика индустрии сходятся — узкий try, осмысленные типы, без пустых catch.


Исключения — не поток управления

Использовать throw вместо обычных веток цикла — тот же запах, что goto. Ожидаемые бизнес-ситуации ("корзина пуста") часто лучше выражать Result, кодом возврата домена или Optional, а исключения оставить для нарушенных инвариантов и сбоев инфраструктуры.


Пустые и широкие catch

try {
parseDate(input);
} catch (Exception e) {
// пусто — пользователь не поймёт, лог пуст
}

На практике:

  • не глотать исключения;
  • маленький блок try — один уровень абстракции;
  • перехватывать конкретные типы, не Exception "на всякий случай".

Коды возврата vs исключения

В C и legacy API коды 0/-1 размазывают проверки. Замените на исключения или Result на границе модуля, чтобы внутри домена не было if (rc != OK) на каждом шаге.


Вложенность try/catch

"Стрелы" из try внутри try лечатся guard clauses и выделением методов — так же, как глубокие if.


Сообщения пользователю и безопасность

Не показывайте стек и внутренние детали конечному пользователю; логируйте полную ошибку на сервере. Связь с безопасностью (санитизация, утечки данных).

Для API — стабильные коды ошибок, correlation id в логах (наблюдаемость).


Ожидаемые случаи

Переписать исключения для ожидаемых отказов: "файл не найден" при экспорте отчёта — часть сценария, а не NullPointerException где-то глубоко.


Связь с null

NullReferenceException часто значит: в модели допустили null там, где нужен Optional или Null Object. Исправление типов обычно эффективнее try/catch вокруг каждого вызова.


На ревью

  1. Новый пустой catch — отклонить.
  2. throws Exception в сигнатуре публичного API — уточнить контракт.
  3. Бизнес-ветка через throw new Exception("error") — заменить типизированным доменным исключением или Result.

Указатель тем — Справочник тем чистого кода. Полная теория (стек, фатальные сбои, отказоустойчивость сервисов) — Ошибки, исключения и отказоустойчивость. См. также тесты и глобалы.