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

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

Разработчику

Тема дополняет быстрый провал и отказ от 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.

Указатель тем — 13. См. также тесты и глобалы.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").