Ответ
Нет, это считается антипаттерном. Исключения предназначены для обработки неожиданных ошибок (ошибки ввода/вывода, сетевая недоступность), а не для управления нормальным потоком выполнения программы.
Почему это плохо:
- Производительность: Создание исключения — дорогая операция из-за построения полного stack trace.
- Читаемость: Логика программы становится скрытой в блоках
try-catch, что усложняет понимание. - Семантика: Исключения для ожидаемых условий (например, "пользователь не найден") размывают границу между ошибкой и нормальным состоянием системы.
Лучшие альтернативы:
- Возврат специальных значений или кодов состояния.
- Использование
Optional<T>для обозначения возможного отсутствия результата. - Применение паттерна Result/Either, который явно инкапсулирует успех или неудачу.
Пример (антипаттерн vs. правильный подход):
// ПЛОХО: Использование исключения для бизнес-правила
try {
processOrder(user.getActiveSubscription());
} catch (NoActiveSubscriptionException e) {
showUpsellPage(); // Это не ошибка, а нормальный сценарий
}
// ХОРОШО: Явная проверка состояния
Optional<Subscription> activeSub = user.getActiveSubscription();
if (activeSub.isPresent()) {
processOrder(activeSub.get());
} else {
showUpsellPage(); // Понятный поток логики
}