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.
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
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.