Когда некоторый код сталкивается с «проблемой», он может создать объект Exception, который описывает проблему, и выбросить его в вызывающий код, чтобы сказать «все пошло не так, как планировалось по причине X».
Вызывающий код должен обрабатывать исключение (с блоком try / catch) и действовать соответствующим образом. Исключение не говорит и не заботится о том, что должно быть сделано дальше.
Если вы находитесь в ситуации, когда вы хотите описать конкретную проблему более точно, чем то, что допускает «стандартное» исключение, вы можете создать собственное исключение. Скажем, вы продаете товары, которые могут быть проданы только людям в возрасте от 20 до 40 лет:
throw new AgeLimitException(clientAge, 20, 40);
И код клиента:
try {
buyProduct();
} catch (AgeLimitException e) {
showMessage("Your age is " + e.getAge() + " but you must be between " + e.minAge()
+ " and " + e.maxAge() + " to buy this product");
}
Как видите, роль AgeLimitException заключается просто в предоставлении информации о возникшей проблеме.