Kjedede unntak i Java

1. Oversikt

I denne artikkelen vil vi se veldig kort på hva Unntak er og gå i dybden om å diskutere de kjedede unntakene i Java.

Enkelt sagt, en unntak er en hendelse som forstyrrer den normale flyten av programmets gjennomføring. La oss nå se nøyaktig hvordan vi kan kjede unntak for å få bedre semantikk ut av dem.

2. Kjedet unntak

Lenket Unntak hjelper til med å identifisere en situasjon der ett unntak forårsaker et annet Unntak i en søknad.

Tenk for eksempel på en metode som kaster en Aritmetisk unntak på grunn av et forsøk på å dele med null, men den faktiske årsaken til unntaket var en I / O-feil som fikk divisoren til å være null. Metoden vil kaste Aritmetisk unntak til innringeren. Innringeren ville ikke vite om den faktiske årsaken til en Unntak. Lenket Unntak brukes i slike situasjoner.

Dette konseptet ble introdusert i JDK 1.4.

La oss se hvordan kjedede unntak støttes i Java.

3. Kastbar Klasse

Kastbar klassen har noen konstruktører og metoder for å støtte kjedede unntak. For det første, la oss se på konstruktørene.

  • Kastbar (kastbar årsak)Kastbar har en enkelt parameter som spesifiserer den faktiske årsaken til en Unntak.
  • Kastbar (strengbeskrivelse, kastbar årsak)denne konstruktøren godtar en Unntak beskrivelse med den faktiske årsaken til en Unntak også.

La oss ta en titt på metodene denne klassen gir:

  • getCause () metode - Denne metoden returnerer den faktiske årsaken som er knyttet til strømmen Unntak.
  • initCause () metode - Det setter en underliggende årsak med påberopning Unntak.

4. Eksempel

La oss nå se på eksemplet der vi skal sette vårt eget Unntak beskrivelse og kaste en lenket Unntak:

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

Som gjettet vil dette føre til:

Fanget: java.lang.ArithmeticException: Top Level Exception. Faktisk årsak: java.io.IO Unntak: IO årsak.

5. Hvorfor lenket unntak?

Vi må kjede unntakene for å gjøre logger lesbare. La oss skrive to eksempler. Først uten å lenke unntakene, og for det andre med kjedede unntak. Senere vil vi sammenligne hvordan logger oppfører seg i begge tilfeller.

For å starte, vil vi lage en serie unntak:

klasse NoLeaveGrantedException utvider Unntak {public NoLeaveGrantedException (strengmelding, kastbar årsak) {super (melding, årsak); } offentlig NoLeaveGrantedException (strengmelding) {super (melding); }} klasse TeamLeadUpsetException utvider unntak {// Begge konstruktørene}

La oss nå begynne å bruke de ovennevnte unntakene i kodeeksempler.

5.1. Uten lenking

La oss skrive et eksempelprogram uten å koble våre tilpassede unntak.

public class MainClass {public void main (String [] args) kaster Unntak {getLeave (); } ugyldig getLeave () kaster NoLeaveGrantedException {prøv {howIsTeamLead (); } fange (TeamLeadUpsetException e) {e.printStackTrace (); kaste nye NoLeaveGrantedException ("La ikke sanksjoneres."); }} ugyldig howIsTeamLead () kaster TeamLeadUpsetException {kast nytt TeamLeadUpsetException ("Team Lead Upset"); }}

I eksemplet ovenfor vil logger se slik ut:

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.java34) ) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Unntak i tråden "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: La ikke sanksjoneres. på com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:37) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29)

5.2. Med kjetting

Deretter la oss skrive et eksempel med kjetting av våre tilpassede unntak:

public class MainClass {public void main (String [] args) kaster Unntak {getLeave (); } offentlig getLeave () kaster NoLeaveGrantedException {prøv {howIsTeamLead (); } catch (TeamLeadUpsetException e) {throw new NoLeaveGrantedException ("Leave not sanctioned.", e); }} offentlig ugyldig howIsTeamLead () kaster TeamLeadUpsetException {kast nytt TeamLeadUpsetException ("Team lead Upset."); }}

Til slutt, la oss se på loggene som er oppnådd med kjedede unntak:

Unntak i tråden "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Leave not sanctioned. på com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:36) på com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Forårsaket av: com.baeldung.chainedexception.exceptions .TeamLeadUpsetException : Teamleder opprørt. på com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:44) på ​​com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:34) ... 1 til

Vi kan enkelt sammenligne viste logger og konkludere med at de kjedede unntakene fører til renere logger.

I denne artikkelen så vi på kjedede unntakskonsept.

Implementeringen av alle eksemplene finnes i Github-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.