I just discovered some lovely code in our companies app that uses Try-Catch blocks as logical operators.
Meaning, "do some code, if that throws this error, do this code, but if that throws this error do this 3rd thing instead".
It uses "Finally" as the "else" statement it appears.
I know that this is wrong inherently...
Come lo sai? Ho rinunciato a tutto questo tipo di "conoscenza" e ora credo solo che il codice più semplice sia il migliore. Supponiamo di voler convertire una stringa in un Opzionale, che è vuoto se l'analisi fallisce. Non c'è niente di sbagliato in:
try {
return Optional.of(Long.valueOf(s));
} catch (NumberFormatException) {
return Optional.empty();
}
Sono completamente in disaccordo con la solita interpretazione di "Le eccezioni sono per condizioni eccezionali". Quando una funzione non può restituire un valore utilizzabile o un metodo non può soddisfare le sue post-condizioni, genera un'eccezione. Non importa quante volte vengono lanciate queste eccezioni fino a quando non si verifica un problema prestazionale prestabilito.
Le eccezioni semplificano il codice, consentendo la separazione della gestione degli errori dal flusso normale. Basta scrivere il codice più semplice possibile, e se è più facile usare try-catch o lanciare un'eccezione, allora fallo.
Le eccezioni semplificano i test riducendo il numero di percorsi attraverso il codice. Una funzione senza rami completerà o genererà un'eccezione. Una funzione con più istruzioni if
per verificare i codici di errore ha molti percorsi possibili. È molto facile ottenere una delle condizioni sbagliate o dimenticarne una completamente, in modo che alcune condizioni di errore vengano ignorate.