Come posso intercettare tutte le eccezioni che verranno generate leggendo e scrivendo un file?


105

In Java, c'è un modo per ottenere (catturare) tutto exceptionsinvece di catturare l'eccezione individualmente?


2
e catturerò tutte quelle eccezioni specifiche con catch (eccezione e) {} ??
Johanna

si. Poiché Exception è la classe base di tutte le eccezioni, catturerà qualsiasi eccezione.
jjnguy

1
@ jjnguy: grazie per la tua buona spiegazione.
Johanna

Sono contento che sia stato utile.
jjnguy

Risposte:


111

Se vuoi, puoi aggiungere clausole throws ai tuoi metodi. Quindi non devi prendere subito i metodi controllati. In questo modo, puoi catturare il exceptionssecondo (forse contemporaneamente agli altri exceptions).

Il codice ha questo aspetto:

public void someMethode() throws SomeCheckedException {

    //  code

}

Quindi più tardi puoi occuparti di exceptionsse non vuoi affrontarli con quel metodo.

Per catturare tutte le eccezioni, alcuni blocchi di codice potrebbero generare: (Questo rileverà anche che Exceptionshai scritto tu stesso)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

Il motivo per cui funziona è perché Exceptionè la classe base per tutte le eccezioni. Quindi qualsiasi eccezione che può essere generata è una Exception('E' maiuscola).

Se vuoi gestire le tue eccezioni, aggiungi semplicemente un catchblocco prima di quello generico.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

Anche se sono d'accordo che non sia un buon stile catturare un'eccezione grezza, ci sono modi per gestire le eccezioni che forniscono una registrazione superiore e la capacità di gestire l'imprevisto. Dal momento che sei in uno stato eccezionale, probabilmente sei più interessato a ottenere buone informazioni che ai tempi di risposta, quindi l'istanza delle prestazioni non dovrebbe essere un grande successo.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Tuttavia, questo non prende in considerazione il fatto che IO può anche generare errori. Gli errori non sono eccezioni. Gli errori sono sotto una gerarchia di ereditarietà diversa da Exceptions, sebbene entrambi condividano la classe base Throwable. Poiché IO ​​può generare errori, potresti voler arrivare al punto di catturare Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

12
Perché non utilizzare più blocchi di cattura?
Carl G

1
Direi che dovresti catturare ogni eccezione in modo esplicito, ma la domanda chiedeva esplicitamente come catturare tutto ciò che un blocco di codice avrebbe generato.
codethulhu

Quel lanciabile è stato utile.
Anshul

Questa è la soluzione che stavo cercando, avevo bisogno di un caso per la gestione delle eccezioni. Grazie
CubeJockey

La punta lanciabile è davvero utile.
cherryhitech

15

Cattura l'eccezione di base "Eccezione"

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Se scrivi questo codice, quasi sicuramente stai facendo qualcosa di terribilmente sbagliato.
George

2
@George Perché l'hai detto?
kuchi

10
@George Non necessariamente, se hai a che fare con qualcosa che ha molti parametri di ingresso sensibili ed è molto complicato verificare la validità di ciascuno di essi, catturare tutti i tipi di eccezioni una volta che i casi di lavoro sono stati adeguatamente testati è la strada da percorrere . Renderà il codice chiaro e molto meno stupido di una condizione enorme e potenzialmente pesante.
Johnride

2
La maggior parte dei programmatori con cui ho lavorato non ha inserito nulla nelle loro dichiarazioni di cattura, quindi usare questo frammento di cattura di prova è in realtà meglio che catturare un gruppo di diversi tipi di eccezione e non farci nulla
Lou Morda

1
@LouisMorda Non sono d'accordo, catturare ogni sottoclasse di eccezione e non fare nulla sulla base di esse (ignorarle) è peggio che catturare solo alcune eccezioni specifiche e ignorarle. Se prendi alcuni tipi di Eccezione e non fai nulla con le informazioni, non hai possibilità di sapere cosa è andato storto in quelle situazioni, ma se prendi tutte le sottoclassi di Eccezione non hai alcuna possibilità di sapere cosa è andato storto in un numero molto elevato di situazioni. Considera come gestiresti le segnalazioni di bug senza le informazioni dalle eccezioni, come stacktrace e messaggi.
zpon

6

È una cattiva pratica rilevare l' eccezione : è semplicemente troppo ampia e potresti perdere qualcosa come una NullPointerException nel tuo codice.

Per la maggior parte delle operazioni sui file, IOException è l'eccezione principale. Meglio prenderlo, invece.


1
È una cattiva pratica catturare l'eccezione. perché? downvote male spiegato
Pedro Sequeira

4

Si C'è.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

Puoi intercettare più eccezioni in un unico blocco di cattura.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

Intendi catturare un Exceptionqualsiasi tipo che viene lanciato, al contrario di solo specifiche eccezioni?

Se è così:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

Cosa devo fare per quelli che non sono specifici ??
Johanna

e catturerò tutte quelle eccezioni specifiche con catch (eccezione e) {} ??
Johanna
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.