Eccezioni concatenate in Java

1. Panoramica

In questo articolo, daremo uno sguardo molto breve a cosa sia l' eccezione e approfondiremo la discussione delle eccezioni concatenate in Java.

In poche parole, un'eccezione è un evento che disturba il normale flusso di esecuzione del programma. Vediamo ora esattamente come possiamo concatenare le eccezioni per ricavarne una semantica migliore.

2. Eccezioni concatenate

L' eccezione concatenata aiuta a identificare una situazione in cui un'eccezione causa un'altra eccezione in un'applicazione.

Ad esempio, si consideri un metodo che genera un'eccezione ArithmeticException a causa di un tentativo di divisione per zero ma la causa effettiva dell'eccezione era un errore I / O che ha causato lo zero del divisore. Il metodo lancerà l'eccezione ArithmeticException al chiamante. Il chiamante non sarebbe a conoscenza della causa effettiva di un'eccezione . L' eccezione concatenata viene utilizzata in tali situazioni.

Questo concetto è stato introdotto in JDK 1.4.

Vediamo come le eccezioni concatenate sono supportate in Java.

3. Classe lanciabile

La classe Throwable ha alcuni costruttori e metodi per supportare le eccezioni concatenate. In primo luogo, diamo un'occhiata ai costruttori.

  • Throwable (causa Throwable) - Throwable ha un solo parametro, che specifica la vera causa di un'eccezione .
  • Throwable (String desc, causa throwable) - questo costruttore accetta un eccezione descrizione con la vera causa di un'eccezione pure.

Successivamente, diamo un'occhiata ai metodi forniti da questa classe:

  • getCause () il metodo - Questo metodo restituisce la causa reale associato con la corrente eccezione .
  • initCause () metodo - Imposta una causa di fondo con invocando eccezioni .

4. Esempio

Ora, diamo un'occhiata all'esempio in cui imposteremo la nostra descrizione di eccezione e lanceremo un'eccezione concatenata :

public class MyChainedException { public void main(String[] args) { try { throw new ArithmeticException("Top Level Exception.") .initCause(new IOException("IO cause.")); } catch(ArithmeticException ae) { System.out.println("Caught : " + ae); System.out.println("Actual cause: "+ ae.getCause()); } } }

Come intuibile, questo porterà a:

Caught: java.lang.ArithmeticException: Top Level Exception. Actual cause: java.io.IOException: IO cause.

5. Perché le eccezioni concatenate?

Dobbiamo concatenare le eccezioni per rendere leggibili i log. Scriviamo due esempi. Primo senza concatenare le eccezioni e secondo, con le eccezioni concatenate. Successivamente, confronteremo come si comportano i log in entrambi i casi.

Per iniziare, creeremo una serie di eccezioni:

class NoLeaveGrantedException extends Exception { public NoLeaveGrantedException(String message, Throwable cause) { super(message, cause); } public NoLeaveGrantedException(String message) { super(message); } } class TeamLeadUpsetException extends Exception { // Both Constructors }

Ora iniziamo a utilizzare le eccezioni precedenti negli esempi di codice.

5.1. Senza concatenamento

Scriviamo un programma di esempio senza concatenare le nostre eccezioni personalizzate.

public class MainClass { public void main(String[] args) throws Exception { getLeave(); } void getLeave() throws NoLeaveGrantedException { try { howIsTeamLead(); } catch (TeamLeadUpsetException e) { e.printStackTrace(); throw new NoLeaveGrantedException("Leave not sanctioned."); } } void howIsTeamLead() throws TeamLeadUpsetException { throw new TeamLeadUpsetException("Team Lead Upset"); } }

Nell'esempio sopra, i registri avranno questo aspetto:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Team lead Upset at com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead(MainClass.java:46) at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:34) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29) Exception in thread "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: Leave not sanctioned. at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:37) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29)

5.2. Con concatenamento

Successivamente, scriviamo un esempio con il concatenamento delle nostre eccezioni personalizzate:

public class MainClass { public void main(String[] args) throws Exception { getLeave(); } public getLeave() throws NoLeaveGrantedException { try { howIsTeamLead(); } catch (TeamLeadUpsetException e) { throw new NoLeaveGrantedException("Leave not sanctioned.", e); } } public void howIsTeamLead() throws TeamLeadUpsetException { throw new TeamLeadUpsetException("Team lead Upset."); } }

Infine, diamo un'occhiata ai log ottenuti con eccezioni concatenate:

Exception in thread "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Leave not sanctioned. at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:36) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29) Caused by: com.baeldung.chainedexception.exceptions .TeamLeadUpsetException: Team lead Upset. at com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead(MainClass.java:44) at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:34) ... 1 more

Possiamo facilmente confrontare i log mostrati e concludere che le eccezioni concatenate portano a log più puliti.

In questo articolo, abbiamo esaminato il concetto di eccezioni concatenate.

L'implementazione di tutti gli esempi può essere trovata nel progetto Github: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.