В каких случаях не рекомендуется объявлять проверяемые исключения (throws) в сигнатуре метода?

«В каких случаях не рекомендуется объявлять проверяемые исключения (throws) в сигнатуре метода?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объявление проверяемых исключений (checked exceptions) через throws может быть проблематичным, особенно в слоях, далеких от источника ошибки (например, в контроллерах или API).

Основные недостатки:

  • Утечка абстракции: Высокоуровневый метод вынужден объявлять низкоуровневые исключения (например, SQLException), раскрывая детали реализации.
  • Нарушение принципа инкапсуляции: Клиентский код должен знать о внутренних исключениях реализации.
  • Усложнение кода: Ведет к цепочкам throws или избыточным блокам try-catch в вызывающих методах.

Рекомендуемый подход:

  1. Оборачивать низкоуровневые проверяемые исключения в непроверяемые (unchecked) исключения уровня приложения.

    public void saveOrder(Order order) {
        try {
            orderRepository.save(order); // Может бросать SQLException
        } catch (SQLException e) {
            // Преобразуем в исключение предметной области
            throw new PersistenceException("Failed to save order: " + order.getId(), e);
        }
    }
  2. Использовать проверяемые исключения осознанно — только для ошибок, от которых разумно ожидать восстановления на уровне непосредственного вызывающего кода, и которые являются неотъемлемой частью контракта метода.

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