Ответ
Проверяемые исключения следует использовать осознанно, когда клиент API обязан обработать ошибку и может это сделать разумно.
✅ Подходящие случаи:
- Восстановимые ошибки — когда клиент может предпринять альтернативное действие (например,
IOExceptionпри работе с файлами). - Ошибки бизнес-логики — которые являются частью контракта метода (например,
InvalidCredentialsException).
❌ Неподходящие случаи:
- Ошибки программирования (например,
NullPointerException). - Системные сбои, которые клиент не может исправить (например, ошибки конфигурации).
Пример хорошего использования:
// Клиент ДОЛЖЕН обработать возможность отсутствия файла
public String readConfigFile(String path) throws IOException {
return Files.readString(Paths.get(path));
}
Пример плохого использования (лучше unchecked):
// Ошибка валидации — обычно это ошибка программиста
public void validate(User user) throws ValidationException {
if (user == null) {
throw new ValidationException("User is null");
}
}
// Лучше:
public void validate(User user) {
if (user == null) {
throw new IllegalArgumentException("User must not be null");
}
}
Основные недостатки проверяемых исключений:
- Увеличивают шаблонный код (обязательные
try-catchилиthrows). - Нарушают принцип открытости/закрытости — изменение сигнатуры метода ломает обратную совместимость.
- Могут приводить к пустым блокам
catchили прокидыванию исключений наверх без реальной обработки.
Рекомендация: Используйте unchecked исключения (RuntimeException) по умолчанию. Проверяемые исключения применяйте только для ошибок, которые являются ожидаемой частью бизнес-логики и требуют обязательной обработки клиентом.