Ответ
Пользовательские исключения (наследники Exception или RuntimeException) используются для точного отражения специфических ошибок предметной области (бизнес-логики).
Преимущества перед стандартными исключениями:
- Семантическая ясность: Имя исключения прямо указывает на суть проблемы (например,
UserNotFoundExceptionvs общееIllegalArgumentException). - Лучшая обработка: Позволяют точечно отлавливать конкретные сценарии сбоев.
- Расширяемость: Можно добавить дополнительные поля, методы или логику.
Пример создания и использования:
// 1. Определение кастомного проверяемого исключения
class InsufficientFundsException extends Exception {
private double deficit;
public InsufficientFundsException(String message, double deficit) {
super(message);
this.deficit = deficit;
}
public double getDeficit() { return deficit; }
}
// 2. Использование в сервисе
class BankAccount {
private double balance;
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
double deficit = amount - balance;
// Бросаем понятное исключение с контекстом
throw new InsufficientFundsException("Withdrawal amount exceeds balance", deficit);
}
balance -= amount;
}
}
// 3. Четкая обработка на верхнем уровне
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
// Обрабатываем именно ошибку недостатка средств
System.err.println("Operation failed: " + e.getMessage());
System.err.println("You need " + e.getDeficit() + " more.");
}
}
} Ответ 18+ 🔞
А, ну ты глянь, какие дела творятся в этом вашем Java-мире! Сидят программисты, блядь, и думают: "А не создать ли мне своё, бизнес-ориентированное исключение, чтобы все сразу поняли, в чём, сука, проблема?" И ведь правы, ёпта!
Вот представь: у тебя банковское приложение, и пользователь пытается снять бабла больше, чем у него есть. Можно, конечно, тупо IllegalArgumentException швырнуть с текстом "чё-то не так". Но это ж, блядь, как сказать "иди нахуй" без объяснения причин — некрасиво и непонятно.
А можно сделать по-человечески, с душой! Создаёшь класс InsufficientFundsException — "Исключение по недостатку средств". Уже из названия ясно, что чувак переоценил свой баланс. Это, блядь, как табличка "Не ходи, упадёшь!" вместо просто "Опасно!".
И в чём, собственно, профит, спросишь ты?
- Всё сразу ясно как божий день. Видишь
UserNotFoundException— и понимаешь, что юзверя в базе нет, а не что там аргумент кривой. Семантика, блядь, наше всё! - Ловишь именно то, что нужно. Не надо хватать все исключения подряд, как мартышка орехи. Поймал
InsufficientFundsException— и обработал именно сценарий "денег нет". Чисто, аккуратно, без лишнего геморроя. - Можно накрутить сверху всякой полезной хуйни. Добавить поля, методы... В нашем примере — поле
deficit(дефицит). Чтобы не просто сказать "денег мало", а конкретно: "Тебе не хватает ровно 500 рублей, дружок-пирожок".
А вот как это выглядит в коде, смотри не обосрись:
// 1. Лепим своё исключение. Наследуемся от Exception (проверяемое) или RuntimeException (непроверяемое).
class InsufficientFundsException extends Exception {
private double deficit; // А вот и наша фишка — поле с дефицитом
public InsufficientFundsException(String message, double deficit) {
super(message); // Сообщение родителю передаём
this.deficit = deficit; // А дефицит себе оставляем
}
public double getDeficit() { return deficit; } // Геттер, чтобы потом вытащить
}
// 2. Используем там, где логика требует
class BankAccount {
private double balance;
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
double deficit = amount - balance;
// ВОТ ОНО, РОЖДЕНИЕ КАСТОМНОЙ ОШИБКИ! Кидаем не абы что, а конкретный объект с данными.
throw new InsufficientFundsException("Снимаешь больше, чем есть, гений?", deficit);
}
balance -= amount;
}
}
// 3. И ловим его на уровне повыше, с умом
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
try {
account.withdraw(1000); // Пытаемся снять тысячу
} catch (InsufficientFundsException e) {
// Ловим именно НЕДОСТАТОК СРЕДСТВ, а не какую-то левую ошибку!
System.err.println("Не вышло, дружище: " + e.getMessage());
System.err.println("Докупи ещё " + e.getDeficit() + " рублей, и будет тебе счастье.");
// Вот тут можно, например, предложить взять кредит, блядь!
}
}
}
Короче, смысл в том, чтобы твой код говорил на языке бизнеса, а не на языке джава-машины. Вместо сухого "ошибка аргумента" — живое и понятное "у клиента денег нет". И все довольны: и система, и тот, кто её потом читает. Красота, ёпта!