Central Exception Handler

2

Recentemente ho pensato a un ExceptionHandler generale, che ho potuto inizializzare una volta nel contesto dell'app e iniettarlo ovunque. L'idea che avrà un'interfaccia abbastanza semplice con solo public void handle(Exception ex) , e quindi in base al tipo di eccezione dovrebbe decidere cosa fare, magari solo registrarlo, o mostrare un messaggio di avviso all'utente, o magari uccidere l'intera app.

La domanda è: qual è il modo più carino per scrivere questo gestore senza un sacco di instanceof s? Sfortunatamente googling mi dà solo il gestore di eccezioni predefinito per RuntimeException introdotto in Java 5.

La mia prima idea è creare un enum, che avrà un campo Class per il tipo di eccezione e restituirà il punto di esecuzione appropriato, ad esempio un gestore di eccezioni concreto che implementa anche l'interfaccia public void handle(Exception ex) , ma con il cast richiesto già .

UPD @alex Ho pensato a questa opzione e c'era una ragione per cui non mi sentivo bene. Supponiamo di avere un codice che utilizza jcif per accedere a un file. La copia semplice nell'archiviazione locale richiede tre wrapper di eccezione: SMBException , MalformedUrlException e IOException . Se non utilizzo Java 7, è possibile che vengano catturati tre volte CenralExceptionHandler.handle (e); che non è leggibile. Ad ogni modo, quando ci penso, è colpa mia se non posso usare Java 7, quindi forse il tuo suggerimento è il migliore. Ma sono ancora in dubbio.

    
posta J-unior 15.11.2012 - 09:59
fonte

1 risposta

1

Che cosa?

No.

Potresti usare il metodo di overloading, qualcosa come

public void handle(FunnyException e) {
    ...
}

public void handle(NastyException e) {
    ...
}

e quando si chiama handle , verrà chiamato il metodo più appropriato. : Tuttavia, direi che in pratica fai tre cose con Eccezioni:

  1. Propagali usando throws
  2. Propagali li avvolgano in un altro tipo di Eccezione
  3. Catturali e fai qualcosa per loro

1 e 2 non valgono la pena; chiamare un gestore di eccezioni generico sarebbe più prolisso rispetto alla semplice scrittura del codice richiesto.

3 tende ad essere un codice più lungo, tuttavia è molto insolito che sia possibile rilevare e trattare le eccezioni allo stesso modo in diverse parti del codice; se lo fai, questo tende ad essere un odore di codice; forse hai bisogno di una dichiarazione di prova più ampia o un qualche codice disgiunto deve essere riunito.

Quindi non penso ci sia un motivo per fare ciò che descrivi.

    
risposta data 15.11.2012 - 22:08
fonte