Chained Exceptions in Java

1. Pregled

U ovom ćemo članku vrlo kratko pogledati što Iznimka jest i detaljno raspravite o lančanim iznimkama na Javi.

Jednostavno rečeno, an iznimka je događaj koji remeti normalan tijek izvršavanja programa. Pogledajmo sada kako točno možemo povezati iznimke kako bismo iz njih izvukli bolju semantiku.

2. Lančane iznimke

Okovan lancima Iznimka pomaže prepoznati situaciju u kojoj jedna iznimka uzrokuje drugu Iznimka u aplikaciji.

Na primjer, razmotrite metodu koja baca ArithmeticException zbog pokušaja dijeljenja s nulom, ali stvarni uzrok iznimke bila je I / O pogreška zbog koje je djelitelj bio nula. Metoda će baciti ArithmeticException pozivatelju. Pozivatelj ne bi znao za stvarni uzrok Iznimka. Okovan lancima Iznimka koristi se u takvim situacijama.

Ovaj koncept predstavljen je u JDK 1.4.

Pogledajmo kako su podržani lančani izuzeci u Javi.

3. Bacljivo Razred

Bacljivo class ima neke konstruktore i metode za podršku lančanim iznimkama. Prvo, pogledajmo konstruktore.

  • Mogućnost bacanja (uzrok bacanja)Bacljivo ima jedan parametar koji određuje stvarni uzrok Iznimka.
  • Može se baciti (Desc desc, Uzrok koji se može baciti)ovaj konstruktor prihvaća Iznimka opis sa stvarnim uzrokom Iznimka također.

Dalje, pogledajmo metode koje nudi ova klasa:

  • getCause () metoda - Ova metoda vraća stvarni uzrok povezan sa strujom Iznimka.
  • initCause () metoda - Postavlja osnovni uzrok pozivanjem Iznimka.

4. Primjer

Pogledajmo sada primjer gdje ćemo postaviti svoje Iznimka opis i baci okovan Iznimka:

javna klasa MyChainedException {public void main (String [] args) {try {throw new ArithmeticException ("Izuzetak najviše razine.") .initCause (novi IOException ("IO uzrok.")); } catch (ArithmeticException ae) {System.out.println ("Uhvaćen:" + ae); System.out.println ("Stvarni uzrok:" + ae.getCause ()); }}}

Kao što se pretpostavlja, to će dovesti do:

Uhvaćen: java.lang.ArithmeticException: Izuzetak najviše razine. Stvarni uzrok: java.io.IOException: IO uzrok.

5. Zašto lančane iznimke?

Moramo povezati iznimke kako bismo zapisnike učinili čitljivima. Napišimo dva primjera. Prvo bez ulančavanja iznimaka i drugo, s ulančanim iznimkama. Kasnije ćemo usporediti kako se trupci ponašaju u oba slučaja.

Za početak ćemo stvoriti niz iznimki:

klasa NoLeaveGrantedException proširuje Exception {public NoLeaveGrantedException (String message, Throwable cause) {super (poruka, uzrok); } javni NoLeaveGrantedException (niz poruka) {super (poruka); }} klasa TeamLeadUpsetException proširuje Exception {// Oba konstruktora}

Počnimo sada koristiti gornje iznimke u primjerima koda.

5.1. Bez lanaca

Napišimo primjer programa bez vezivanja naših prilagođenih iznimaka.

javna klasa MainClass {public void main (String [] args) baca iznimku {getLeave (); } void getLeave () baca NoLeaveGrantedException {try {howIsTeamLead (); } catch (TeamLeadUpsetException e) {e.printStackTrace (); baci novi NoLeaveGrantedException ("Ostavite bez sankcija."); }} void howIsTeamLead () baca TeamLeadUpsetException {bacanje novog TeamLeadUpsetException ("Uzrujavanje vodstva tima"); }}

U gornjem primjeru zapisnici će izgledati ovako:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Uzrujavanje vodstva tima na com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:46) na com.baeldung.chainedexception.exceptions.MajeClass. ) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Iznimka u niti "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: Ostavite bez sankcija. na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:37) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29)

5.2. S Chainingom

Dalje, napišite primjer s lancima naših prilagođenih iznimaka:

javna klasa MainClass {public void main (String [] args) baca iznimku {getLeave (); } public getLeave () baca NoLeaveGrantedException {try {howIsTeamLead (); } catch (TeamLeadUpsetException e) {throw new NoLeaveGrantedException ("Ostavite bez sankcija.", e); }} public void howIsTeamLead () baca TeamLeadUpsetException {bacanje novog TeamLeadUpsetException ("Uzrujavanje vodstva tima."); }}

Na kraju, pogledajmo zapisnike dobivene s lančanim iznimkama:

Iznimka u niti "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Ostavite bez sankcija. na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:36) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Uzrok: com.baeldung.chainedexception.exceptions .TeamException. : Vodstvo tima uzrujano. na com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:44) na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:34) ... još 1

Lako možemo usporediti prikazane zapisnike i zaključiti da lančani izuzeci vode do čistijih dnevnika.

U ovom smo članku pogledali koncept lančanih iznimaka.

Implementacija svih primjera može se naći u projektu Github - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.