2012-11-14 13 views
18

Ho una dichiarazione che genera un sacco di eccezioni controllate. Posso aggiungere tutti i blocchi di cattura per tutti loro in questo modo:È possibile rilevare tutte le eccezioni tranne le eccezioni di runtime?

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch(ClassCastException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch... 

Non mi piace questo perché sono tutti trattati allo stesso modo per cui v'è una sorta di duplicazione del codice e c'è anche un sacco di codice da scrivere. Invece potrebbe prendere Exception:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 

Questo sarebbe stato ok, tranne che voglio tutte le eccezioni di runtime per essere gettati via senza essere scoperti. c'è qualche soluzione a questo? Stavo pensando che qualche intelligente dichiarazione generica del tipo di eccezione da catturare potrebbe fare il trucco (o forse no).

risposta

40

Si potrebbe fare la seguente:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(RuntimeException ex) { 
    throw ex; 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+2

buona risposta ... +1 – Juvanis

+2

+1 Freddo. Non è più pulito che abbia mai visto, ma fa il trucco. – drasto

11

Se è possibile utilizzare Java 7, è possibile utilizzare un Multi-Catch:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException|ClassCastException|... ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+0

+1 che mi avvisa di questa nuova funzionalità valida (e attesa da tempo IMO) in Java 7 –

+0

+1 Per questa ragione utilizzerò Java 7 se possibile. Ma non posso e sono molto dispiaciuto per questo perché questo Multi-Catch è perfetto. Devo usare Java 6: ((( – drasto

1

Si potrebbe provare qualcosa di simile, per catturare praticamente tutto e poi ri-lanciare la RuntimeException se si tratta di un'istanza di quella classe ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    if (ex instanceof RuntimeException){ 
     throw ex; 
    } 
    else { 
     throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
    } 
} 

Visto che se questo sarebbe disordinato di scrivere più e più volte (e male per manutenibilità), probabilmente sarei spostare il codice in una classe diversa, qualcosa di simile ...

public class CheckException { 
    public static void check(Exception ex, String message) throws Exception{ 
     if (ex instanceof RuntimeException){ 
      throw ex; 
     } 
     else { 
      throw new MyCustomInitializationException(message, ex); 
     } 
    } 
} 

e utilizzarlo in il vostro codice come questo ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    CheckException.check(ex,"Class Resolver could not be initialized."); 
} 

Notando che passiamo nella message in modo che possiamo ancora personalizzare il nostro MyCustomInitializationException.

+0

L'ultima opzione sarebbe buona se avessi bisogno di farlo parecchie volte ma non è il mio caso - ho solo bisogno di usarlo una volta. Solo mi piacerebbe parametrizzare il metodo statico con 'String 'messaggio. – drasto

+0

devi inserire' ex' su 'RuntimeException' nel codice. –

Problemi correlati