2015-03-25 9 views
6

Dato questo stacktrace:Esiste un modo migliore per rilevare solo cause specifiche di un'eccezione?

java.lang.RuntimeException: 
... 
Caused by: com.mypackage.SpecificException 

E questo try-catch:

try { 
    ts.init(); 
} catch (RuntimeException e) { 
    if (e.getCause() instanceof SpecificException) { 
     //do something 
    } else { 
     throw e; 
    } 
} 

non posso modificare il codice per SpecificException né il metodo che avvolge questa eccezione in un RuntimeException.

C'è un modo migliore per prendere solo SpecificException?

+0

possibile duplicato di [Java: rilevamento di eccezioni specifiche] (http://stackoverflow.com/questions/4566450/java-catching-specific-exceptions) – Sim

+1

@Sim non è un duplicato perché OP desidera/deve gestire la causa della 'RuntimeException', se presente. –

+0

Cosa c'è di sbagliato nella soluzione che suggerisci? – assylias

risposta

5

L'unico meccanismo che Java consente di selezionare quali eccezioni da prendere sono le specifiche classi di eccezioni. Se si desidera discriminare tra le eccezioni della stessa classe in base alle loro cause, è necessario rilevare tutte le eccezioni di quella classe, come si dimostra.

Si noti, tuttavia, che è problematico rilanciare un'eccezione una volta rilevata, poiché sostituisce la traccia dello stack originale con una nuova specifica per il contesto del nuovo throw. Questo può rendere il debug molto più difficile. Per evitare ciò, è necessario avvolgere l'eccezione rilevata come causa di una nuova eccezione separata e lanciarla.

+0

Nota, a proposito, che se ci sono possibilità che tu abbia più livelli di (catturare, avvolgere, lanciare) allora potresti dover controllare più della causa dell'eccezione che hai catturato: potresti aver bisogno anche di controllare la causa della causa e * quella * causa dell'eccezione, ecc. –

+0

+1. D'altra parte, OP, lo stai incontrando perché * una libreria che non controlli sta generando eccezioni che si diffondono ai chiamanti del tuo componente *. Racchiudere le eccezioni della tua libreria non è sempre necessario o utile, ma può fornirti più controllo e documentazione sulle eccezioni che emergono se il tuo codice. (Questo è particolarmente importante nella progettazione dell'API). –