Corretta propagazione / gestione delle eccezioni

1

Sto cercando di imparare attraverso l'esempio su un modo corretto per gestire le eccezioni. Quando dovrei prenderlo, quando e come dovrei buttarlo più in basso?

In questo esempio ho una configurazione molto semplice:

  • MainMethod
    • ExceptionHandler // Qui è dove mi piacerebbe intercettare e risolvere la maggior parte delle eccezioni
      • ExceptionGenerator // Gli errori iniziano da qui
public List<String> readFile(String pathStr) throws InvalidPathException, IOException {

    Path path = Paths.get(Repository.fixPath(pathStr));         // This can throw both FileNotFoundException and InvalidPathException, I think. It should!
    List<String> fileContent;

    try {

        fileContent = Files.readAllLines(path, StandardCharsets.UTF_8);
        return fileContent;

    } catch (IOException e) {
        throw new IOException("Could not read file content");
    }
}


// FileNotFoundException (FNFE) should be sent to the previous method
private static String fixPath(String path) throws FileNotFoundException {

    if (path.isEmpty() || path == null) 
        throw new FileNotFoundException();

    ...

    return path;
}

Punti di interesse:

  • Il mio metodo readFiles deve rilevare il FileNotFoundException generato dal secondo metodo? Dovrei quindi buttarlo di nuovo, come con IOException ? Come funziona esattamente il messaggio (il parametro per l'eccezione)? È effettivamente utilizzabile in qualsiasi modo tranne la stampa?

  • Se ho IOException (sostituisce il FNFE, posso ancora lanciare il FNFE quindi catturare prima FNFE e IOE in secondo luogo?)

posta Kalec 15.09.2015 - 11:40
fonte

1 risposta

2
catch (IOException e) {
    throw new IOException("Could not read file content");
}

Questa è una pessima pratica perché stai perdendo tutto lo stacktrace di e ! Pertanto, quando rilevi questa eccezione non avrai alcuna informazione sulla causa root dell'eccezione.

Se veramente hai bisogno di aggiungere un messaggio specifico a questo livello, considera di farlo in questo modo: throw new IOException("Could not read file content", e);

Cosa readFile deve lanciare? Dipende dalla verbosità che vuoi esporre.

Caso dettagliato

public List<String> readFile(String pathStr) throws FileNotFoundException, IOException { }

Questo caso è appropriato quando vuoi indicare al chiamante che le eccezioni generate da questo metodo dovrebbero essere gestite in modo diverso.

Caso meno dettagliato

public List<String> readFile(String pathStr) throws IOException { }

Questo caso è appropriato quando non vuoi preoccuparti dei dettagli dell'eccezione (basti sapere che "qualcosa è andato storto" è sufficiente).

    
risposta data 15.09.2015 - 11:59
fonte

Leggi altre domande sui tag