Jest źle.
- Wyjątki
NoArgumentException i TooManyArgumentException nie powinny w ogóle być wyrzucane w tym przypadku. W momencie gdy masz nieprawidłową ilość argumentów to powinieneś od razu przejść do obsługi takiego stanu. Nie jest on WYJĄTKOWY, użytkownik może, i na pewno się pomyli. Wyjątek możesz rzucić jeżeli cały mechanizm obsługi błędów jest umieszczony w innej warstwie.
- Wyjątek
IOException jest zbyt ogólny. Zastąp go własnym wyjątkiem, który będzie coś mówił.
- Wyjątek
NumberFormatException powinien zostać przechwycony i to jest ok, ale znowuż nie masz tu warstwy obsługi.
Kopiuj
public class MainControl {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
validateInput(args);
int input = parseInput(args[0]);
MenuControl enter = new MenuControl(input);
enter.mainMenuDisplay();
} catch (IOException | NoArgumentException | TooManyArgumentException | ParseException e) {
ExceptionHandler.handle(e);
}
}
//..
}
W tej wersji masz kod podzielony na warstwy. Warstwa niższa warstwa sprawdza warunki i jak trafia na błąd to wyrzuca wyjątek. Niech ten kto wywołał się martwi.
ExceptionHandler.handle(e) obsługuje wyjątek z godnie z ogólną polityką.
I trochę inne podejście
Kopiuj
public class MainControl {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
RunInSecure.runThis(() -> {
validateInput(args);
int input = parseInput(args[0]);
MenuControl enter = new MenuControl(input);
enter.mainMenuDisplay();
return null;
}, new ExceptionHandler(), null);
}
}
class RunInSecure {
public static <T> T runThis(Callable<T> callable, ExceptionHandler handler, T def) {
try {
return callable.call();
} catch (Exception e) {
handler.handle(e);
}
return def;
}
}
w tym przypadku delegujemy uruchomienie kodu do osobnego obiektu, który będzie zajmować się obsługą błędów jak by coś się wysypało. Można to jeszcze delikatnie podrasować, ale to już będzie zbyt skomplikowane rozwiązanie jak na taki kod.