È una buona pratica catturare tutte le eccezioni? [duplicare]

2

Il frammento di seguito (in java) fornisce un esempio della mia domanda.

try {
                  // code implementation here
                    }
                } catch (Exception ex) {

                }

Ora, è una buona pratica? Influisce sulle prestazioni del codice. È sempre meglio essere specifici con l'eccezione che vuoi catturare o solo sempre tutte le eccezioni e non preoccuparti di fare qualcosa del genere?

try {
                    //code implementation
                } catch (IOException | SQLException | NullPointerException ex ) {

                }
    
posta belvi 17.01.2015 - 17:19
fonte

2 risposte

8

È solo una buona pratica catturare un'eccezione specifica se può effettivamente essere gestita dal blocco catch.

Molto spesso, i programmatori presumono che l'errore possa essere gestito del tutto, vicino al punto in cui si verifica. Questo è spesso sbagliato. Per capire perché, dobbiamo esplorare cosa significa "gestione".

Il tuo secondo frammento:

try {
    // code implementation
} catch (IOException | SQLException | NullPointerException ex ) {
    // handle exception
}

implica che potrebbero esserci alcune azioni utili che potrebbero gestire l'eccezione rilevata. Ma spesso non è così. Come è stato notato nei commenti, le prestazioni sono irrilevanti se il codice fornisce risultati errati.

L'unica cosa che puoi fare con NullPointerException è registrare tutto ciò che è importante per il debugging e la morte; ogni ulteriore tentativo di continuare ha un'alta probabilità di stomping sull'heap e di rompere altre cose a valle. Questa eccezione deriva da un difetto del software e non può essere gestita correttamente.

Suppongo che code implementation consista nella lettura di un istream. La gestione di una IOException potrebbe essere semplice come rileggere la parte che ha generato l'eccezione (se causata da una chiamata di sistema interrotta) ma questo è il caso raro e un'eccezione troppo generalizzata. Se l'errore è FileNotFoundException, hai un difetto upstream che non può essere gestito in questo contesto. Chi potrebbe gestirlo? Il codice che ha creato l'istream avrebbe potuto gestire l'eccezione se c'era un file alternativo ragionevole da aprire, ma lo snippet di esempio dovrebbe essere privo delle informazioni. Se stessimo tentando di aprire un file senza alternative ragionevoli, tutto ciò che l'apri può fare è lanciare un'eccezione stessa.

Perché? Perché c'è un contratto tra il codice di apertura e il suo chiamante che dice "dammi un percorso, e lo aprirò per te e ti darò un istream". Su FileNotFoundException, il codice di apertura non è riuscito a soddisfare il suo contratto e indurrà errori nel chiamante e in altri luoghi in cui si accede all'istream. È questa violazione del contratto è il caso più strong per le eccezioni.

Supponiamo che FileNotFoundException sia stato lanciato in un programma a esecuzione prolungata come un editor. Sarebbe scortese che l'applicazione si arresti in modo anomalo solo perché hai digitato un nome di file. In questo caso, l'eccezione dovrebbe essere consentita per propagarsi fino al ciclo principale che effettivamente può gestirlo: cioè informando l'utente "file non trovato" dando così all'utente la possibilità di provare un altro nome file.

Quando un'eccezione implica un errore del contratto, tale eccezione deve propagarsi verso l'alto fino a quando non vi è un codice che può effettivamente correggere l'errore del contratto. Se non è possibile correggere l'errore (come in cat not_a_file ), il meglio che puoi fare è stampare un messaggio di errore significativo e (come in cat not_a_file a_file ) saltare not_a_file .

    
risposta data 17.01.2015 - 19:20
fonte
-5

Supponiamo che il controllo di eccezioni specifiche abbia un impatto sulle prestazioni (anche se è minimo) perché il programma confronta l'eccezione innescata con 3 valori diversi, passando invece direttamente alla clausola di eccezione. Ciò aumenterebbe il numero di cicli della CPU presi, quindi ridurrebbe le prestazioni.

Tuttavia, elencare tutte le eccezioni non migliora la leggibilità o la funzionalità del codice, quindi ti suggerirei di catturare tutte le eccezioni per impostazione predefinita, a meno che non sia necessario rilevare un tipo esatto di eccezione.

    
risposta data 17.01.2015 - 19:04
fonte

Leggi altre domande sui tag