Napisałem funkcję, która prosi użytkownika o wprowadzenie danych, dopóki użytkownik nie wprowadzi dodatniej liczby całkowitej (liczby naturalnej). Ktoś powiedział, że nie powinienem wyrzucać i wychwytywać wyjątków w mojej funkcji i pozwolić, aby wywołujący moją funkcję je obsługiwał.
Zastanawiam się, co sądzą o tym inni programiści. Prawdopodobnie niewłaściwie wykorzystuję wyjątki w funkcji. Oto kod w Javie:
private static int sideInput()
{
int side = 0;
String input;
Scanner scanner = new Scanner(System.in);
do {
System.out.print("Side length: ");
input = scanner.nextLine();
try {
side = Integer.parseInt(input);
if (side <= 0) {
// probably a misuse of exceptions
throw new NumberFormatException();
}
}
catch (NumberFormatException numFormExc) {
System.out.println("Invalid input. Enter a natural number.");
}
} while (side <= 0);
return side;
}
Interesują mnie dwie rzeczy:
- Czy powinienem pozwolić rozmówcy martwić się o wyjątki? Istotą tej funkcji jest to, że dręczy użytkownika, dopóki użytkownik nie wprowadzi liczby naturalnej. Czy punkt funkcji jest zły? Nie mówię o interfejsie użytkownika (użytkownik nie jest w stanie wydostać się z pętli bez odpowiedniego wejścia), ale o zapętlonym wejściu z obsługiwanymi wyjątkami.
- Czy powiedziałbyś, że instrukcja throw (w tym przypadku) jest niewłaściwym wykorzystaniem wyjątków? Mogę łatwo utworzyć flagę do sprawdzania poprawności numeru i wypisać komunikat ostrzegawczy na podstawie tej flagi. Ale to dodałoby więcej linii do kodu i myślę, że jest on w pełni czytelny.
Rzecz w tym, że często piszę osobną funkcję wejściową. Jeśli użytkownik musi wprowadzić liczbę wiele razy, tworzę osobną funkcję wprowadzania, która obsługuje wszystkie wyjątki i ograniczenia formatowania.