Винятки мають бути лише такими .. винятками. Найкращою практикою при використанні винятків є використання їх для висвітлення ситуації, в якій трапляється щось, що суперечить тому, що ви б очікували, що трапиться. Класичний приклад - FileNotFoundException, який викидається, коли файлу просто немає. Якщо ви тестуєте існування файлу, тоді ви використовуєте File.exists (), оскільки ви просто продаєтеся 10-футовою паличкою, щоб побачити, чи вдарили ви щось.
Ви технічно можете досягти тих же результатів, оточуючи їх у спробі лову та використовуючи файл, як ніби він існує, але А) винятки, як правило, дорого витратні на ресурси, і B) програмісти припускають, що ви мали на увазі, що файл існував, якщо він був у випробуванні, що додає загальній плутанині програми.
Є багато ситуацій, в яких я напишу метод, який отримує якесь значення з бази даних. Тисяча речей може піти не так, і, дивлячись, як мені потрібна лише одна невелика інформація, незручно оточувати виклик списком спробу вловлювання, який містить 5 різних винятків. Тож я виберу винятки в методі отримання. Якщо щось піде не так, я вживаю будь-яких відповідних дій, щоб закрити підключення до бази даних чи що-небудь в остаточному пункті та повернути null. Це хороша практика не лише тому, що вона спрощує ваш код, але й тому, що "null" надсилає те саме повідомлення, яке ви могли отримати від винятку .. що щось не пішло, як було заплановано. Керуйте специфікою виключень у методі отримання, але керуйте, що робити, коли речі не роблять '
Наприклад:
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..
}
}