Eccezione eccezionale, quanto è necessario? [duplicare]

5

Diciamo che ho alcuni metodi che accedono al File System, e voglio che siano un po 'robusti, voglio lanciare degli errori in modo che l'utente possa reagire:

  • Se il file non ha diritti di lettura / scrittura, desidero informarlo.
  • Se il file non esiste, desidero chiedergli di sceglierne un altro.

E così via.

Il fatto è che le eccezioni ingombrano un po 'il codice:

  • FileNotFoundException : abbastanza necessario, il file non è stato trovato, riprova o rinuncia.

  • IOException : di solito è quando il file non può essere letto per qualsiasi motivo.
    Era lì, ma ora non lo è, non hai più diritti di accesso, qualcosa è andato terribilmente storto. Generalmente questo è un punto di arresto, ma comunque l'utente potrebbe scegliere un altro file o qualcosa del genere, preferirei non bloccare l'app.

  • InvalidPathException : o lo sviluppatore o l'utente ha cercato di dare un brutto percorso (come includere un carattere illegale nel nome del file, di nuovo, a causa di ciò l'app non dovrebbe bloccarsi.

Nel mio caso direi che tutte queste eccezioni sono importanti perché IOE cattura FNFE, ma vengono risolte in modo diverso, e mentre FNFE e Percorso non valido sono simili, devo comunque lanciarle separatamente, ma almeno catturarle insieme.

La mia domanda è

Quando le eccezioni iniziano ad accumularsi, il codice inizia a diventare brutto, immagino che non ci siano problemi per questo?

    
posta Kalec 28.09.2015 - 13:00
fonte

2 risposte

5

Poiché il flusso dovrebbe essere lo stesso con i 3 tipi di eccezioni:

  • L'utente sceglie un file
  • Se il file non può essere aperto (perché il file non esiste, è bloccato, percorso non valido, ...), avvisalo con un messaggio personalizzato
  • Permetti all'utente di riprovare l'operazione

Suggerisco di creare una classe personalizzata che eredita da Exception . In questa eccezione, è necessario eseguire il wrapping:

  • l'eccezione originale (IOE, FNFE, IPE) per preservare lo stacktrace
  • un messaggio personalizzato che potrebbe essere visualizzato dall'utente (o una chiave per una stringa i18n se necessario)

Esempio:

public final class FileException extends Exception {
    public FileException(String message, Throwable cause) {
        super(message, cause);
    }
}

Il passo più importante del tuo codice è lanciare un FE in questo modo:

try {
    //some operation that can throw an FNFE
}
catch(FileNotFoundException e) {
    throw new FileException("The file doesn't exist !", e);
}
    
risposta data 28.09.2015 - 13:31
fonte
3

Configura la crude richiesta da più eccezioni al più piccolo ambito possibile, quindi avvolgila nel tuo tipo di eccezione che conserva tutte le informazioni originali.

Per elaborare: diciamo che devi occuparti di FileNotFoundException , PermissionsException , ReadOnlyFileSystemException e invalidpathException , e tutti questi non hanno un super tipo comune (o non vuoi diluire il informazioni così tanto ottenendo semplicemente IOException ). Quello che dovresti fare è scrivere un metodo che catturi tutte queste diverse eccezioni e ridisegna in ogni caso un PreferencesException auto-scritto, solo annotato con le informazioni sull'errore originale se necessario. In questo modo, ogni altro metodo nel tuo codice base deve solo gestire quel tipo di eccezione (o possibilmente senza alcun tipo se il tuo nuovo tipo di eccezione non è un'eccezione controllata).

    
risposta data 28.09.2015 - 13:31
fonte

Leggi altre domande sui tag