Wyjątki powinny być właśnie… wyjątkami. Najlepszą praktyką przy stosowaniu wyjątków jest wykorzystanie ich do uwzględnienia sytuacji, w której dzieje się coś sprzecznego z tym, czego się spodziewałbyś. Klasycznym przykładem jest FileNotFoundException, który jest generowany, gdy pliku po prostu nie ma. Jeśli testujesz istnienie pliku, użyj File.exists (), ponieważ po prostu naciskasz 10-metrowym drążkiem, aby sprawdzić, czy coś nie trafi.
Można technicznie osiągnąć te same wyniki, otaczając go w próbach catch i używając pliku tak, jakby istniał, ale A) wyjątki są generalnie kosztowne pod względem zasobów i B) programiści zakładają, że masz na myśli istnienie pliku, gdyby był w try catch, co zwiększa ogólne zamieszanie w programie.
Jest wiele sytuacji, w których napiszę metodę, która pobiera pewną wartość z bazy danych. Tysiąc rzeczy może się nie udać, a ponieważ potrzebuję tylko jednej małej informacji, niewygodne jest otaczanie połączenia listą próbną zawierającą 5 różnych wyjątków. Więc złapię wyjątki w metodzie pobierania. Jeśli coś pójdzie nie tak, podejmę wszelkie odpowiednie działania, aby zamknąć połączenie z bazą danych lub cokolwiek innego w klauzuli ostatecznie i zwrócę null. Jest to dobra praktyka nie tylko dlatego, że upraszcza twój kod, ale również dlatego, że „null” wysyła tę samą wiadomość, którą mógłbyś otrzymać z wyjątku .. że coś nie poszło zgodnie z planem. Zarządzaj specyfikacjami wyjątków w metodzie pobierania, ale zarządzaj, co robić, gdy rzeczy nie są
Na przykład:
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..
}
}