Kædede undtagelser i Java

1. Oversigt

I denne artikel vil vi se meget kort på hvad Undtagelse er og gå i dybden med at diskutere de kædede undtagelser i Java.

Kort sagt, en undtagelse er en begivenhed, der forstyrrer den normale strøm af programmets udførelse. Lad os nu se nøjagtigt, hvordan vi kan kæde undtagelser for at få bedre semantik ud af dem.

2. Kædede undtagelser

Lænket Undtagelse hjælper med at identificere en situation, hvor en undtagelse forårsager en anden Undtagelse i en ansøgning.

Overvej f.eks. En metode, der kaster en Aritmetisk undtagelse på grund af et forsøg på at dividere med nul, men den faktiske årsag til undtagelsen var en I / O-fejl, der fik divisoren til at være nul. Metoden vil kaste Aritmetisk undtagelse til den, der ringer op. Den, der ringer op, vidste ikke om den faktiske årsag til en Undtagelse. Lænket Undtagelse bruges i sådanne situationer.

Dette koncept blev introduceret i JDK 1.4.

Lad os se, hvordan kædede undtagelser understøttes i Java.

3. Kan kastes Klasse

Kan kastes klasse har nogle konstruktører og metoder til at understøtte kædede undtagelser. Lad os først se på konstruktørerne.

  • Kan kastes (Årsag, der kan kastes)Kan kastes har en enkelt parameter, der angiver den faktiske årsag til en Undtagelse.
  • Kan kastes (String desc, Throwable cause)denne konstruktør accepterer en Undtagelse beskrivelse med den faktiske årsag til en Undtagelse såvel.

Lad os derefter se på de metoder, som denne klasse giver:

  • getCause () metode - Denne metode returnerer den faktiske årsag, der er knyttet til strømmen Undtagelse.
  • initCause () metode - Det angiver en underliggende årsag med påberåbelse Undtagelse.

4. Eksempel

Lad os nu se på eksemplet, hvor vi vil sætte vores egne Undtagelse beskrivelse og kaste en lænket Undtagelse:

offentlig klasse MyChainedException {public void main (String [] args) {try {throw new ArithmeticException ("Top Level Exception.") .initCause (new IOException ("IO cause.")); } fangst (ArithmeticException ae) {System.out.println ("Fanget:" + ae); System.out.println ("Faktisk årsag:" + ae.getCause ()); }}}

Som gættet vil dette føre til:

Fanget: java.lang.ArithmeticException: Top Level Exception. Faktisk årsag: java.io.IO Undtagelse: IO årsag.

5. Hvorfor kædede undtagelser?

Vi er nødt til at kæde undtagelserne for at gøre logfiler læsbare. Lad os skrive to eksempler. Først uden sammenkædning af undtagelserne og for det andet med kædede undtagelser. Senere sammenligner vi, hvordan logfiler opfører sig i begge tilfælde.

For at starte, opretter vi en række undtagelser:

klasse NoLeaveGrantedException udvider Undtagelse {public NoLeaveGrantedException (strengbesked, kastbar årsag) {super (besked, årsag); } offentlig NoLeaveGrantedException (streng besked) {super (besked); }} klasse TeamLeadUpsetException udvider undtagelse {// Begge konstruktører}

Lad os nu bruge ovenstående undtagelser i kodeeksempler.

5.1. Uden lænkning

Lad os skrive et eksempelprogram uden at kæde vores brugerdefinerede undtagelser.

offentlig klasse MainClass {public void main (String [] args) kaster Undtagelse {getLeave (); } ugyldigt getLeave () kaster NoLeaveGrantedException {prøv {howIsTeamLead (); } fange (TeamLeadUpsetException e) {e.printStackTrace (); smid nyt NoLeaveGrantedException ("Efterlad ikke sanktioneret."); }} ugyldigt hvordanIsTeamLead () kaster TeamLeadUpsetException {kast nyt TeamLeadUpsetException ("Team Lead Upset"); }}

I eksemplet ovenfor vil logfiler se sådan ud:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Team lead Upset at com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:46) på com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java34) ) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Undtagelse i tråden "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: Efterlad ikke sanktioneret. på com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:37) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29)

5.2. Med lænkning

Lad os derefter skrive et eksempel med sammenkædning af vores brugerdefinerede undtagelser:

offentlig klasse MainClass {public void main (String [] args) kaster Exception {getLeave (); } offentlig getLeave () kaster NoLeaveGrantedException {prøv {howIsTeamLead (); } catch (TeamLeadUpsetException e) {throw new NoLeaveGrantedException ("Efterlad ikke sanktioneret.", e); }} offentlig ugyldighed howIsTeamLead () kaster TeamLeadUpsetException {kast nyt TeamLeadUpsetException ("Team lead Upset."); }}

Lad os endelig se på logfiler opnået med kædede undtagelser:

Undtagelse i tråden "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Efterlad ikke sanktioneret. på com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:36) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Forårsaget af: com.baeldung.chainedexception.exceptions .TeamLeadUpsetException : Team lead Upset. på com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:44) på ​​com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:34) ... 1 mere

Vi kan let sammenligne viste logfiler og konkludere, at de kædede undtagelser fører til renere logfiler.

I denne artikel så vi på konceptet med kædede undtagelser.

Implementeringen af ​​alle eksempler findes i Github-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.