← Назад к вопросам

Можно ли использовать Exception, как часть бизнес логики?

1.8 Middle🔥 161 комментариев
#Docker, Kubernetes и DevOps#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Можно ли использовать Exception как часть бизнес логики?

Краткий ответ

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

Почему это плохая идея

1. Исключения дорогие

Выброс исключения создаёт stack trace, что требует значительных ресурсов:

// ПЛОХО: Исключения для нормального потока
public double divide(int a, int b) {
    try {
        return a / b;
    } catch (ArithmeticException e) {
        return 0;
    }
}

// ХОРОШО: Проверка перед выполнением
public double divide(int a, int b) {
    if (b == 0) {
        return 0;
    }
    return (double) a / b;
}

Твет creation исключения может стоить 10-100+ микросекунд.

2. Снижает читаемость кода

Исключения усложняют логику и затрудняют понимание нормального потока выполнения.

3. Усложняет тестирование

Тесты с проверкой исключений громоздче чем проверка возвращаемых значений.

Правильный подход для бизнес-логики

1. Используй Result/Optional паттерны

public class PaymentResult {
    private final boolean success;
    private final String errorMessage;
    
    public static PaymentResult success() {
        return new PaymentResult(true, null);
    }
    
    public static PaymentResult failure(String error) {
        return new PaymentResult(false, error);
    }
}

2. Используй Optional для null-checks

return list.stream().findFirst();

3. Возвращай явные результаты

PaymentResult result = processPayment(user, amount);
if (result.isSuccess()) {
    // Обработать успех
} else {
    log.warn("Ошибка платежа: " + result.getErrorMessage());
}

Когда МОЖНО использовать исключения

Исключения нужны для обработки истинных ошибок:

public User findUserById(UUID id) throws UserNotFoundException {
    return userRepository.findById(id)
        .orElseThrow(() -> new UserNotFoundException(
            "Пользователь не найден"
        ));
}

Вывод

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

Можно ли использовать Exception, как часть бизнес логики? | PrepBro