Исключения должны быть именно такими ... исключениями. При использовании исключений рекомендуется использовать их для освещения ситуации, в которой происходит нечто, противоречащее тому, что вы ожидаете. Классическим примером является исключение FileNotFoundException, которое выдается, когда файла просто нет. Если вы проверяете существование файла, вы используете File.exists (), так как вы просто толкаете 10-футовую палку, чтобы увидеть, ударили ли вы что-нибудь.
Технически вы можете достичь тех же результатов, окружив его попыткой catch и используя файл, как если бы он существовал, но A) исключения, как правило, являются дорогостоящими, и B) программисты предполагают, что вы подразумевали, что файл существует, если он был в попытке поймать, что добавляет общую путаницу программы.
Во многих ситуациях я напишу метод, который выбирает какое-то значение из базы данных. Тысяча вещей может пойти не так, и, учитывая, что мне нужен только один маленький фрагмент информации, неудобно окружать вызов списком перехвата попыток, который содержит 5 различных исключений. Итак, я поймаю исключения в методе fetch. Если что-то пойдет не так, я предприму все необходимые действия, чтобы закрыть соединение с базой данных или еще что-то в предложении finally и вернуть ноль. Это хорошая практика не только потому, что это упрощает ваш код, но также и потому, что «null» отправляет то же сообщение, которое вы могли получить из исключения… что-то пошло не так, как планировалось. Управляйте особенностями исключений в методе fetch, но управляйте тем, что делать, когда что-то не так
Например:
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}