Láncolt kivételek a Java-ban

1. Áttekintés

Ebben a cikkben nagyon röviden áttekintjük, hogy mit Kivétel és folytassa a Java-ban a láncolt kivételek megvitatását.

Egyszerűen fogalmazva: an kivétel olyan esemény, amely megzavarja a program futtatásának normál folyamatát. Lássuk, pontosan miként tudjuk láncolni a kivételeket, hogy jobb szemantikát kapjunk belőlük.

2. Láncolt kivételek

Láncolva Kivétel segít azonosítani egy olyan helyzetet, amelyben az egyik kivétel a másikat okozza Kivétel egy alkalmazásban.

Vegyünk például egy metódust, amely egy Számtani kivétel nulla osztási kísérlet miatt, de a kivétel tényleges oka egy I / O hiba volt, amely miatt az osztó nulla volt. A módszer a Számtani kivétel a hívónak. A hívó nem tudna a tényleges okáról Kivétel. Láncolva Kivétel olyan helyzetekben használják.

Ezt a koncepciót a JDK 1.4-ben vezették be.

Lássuk, hogyan támogatják a láncolt kivételeket a Java.

3. Dobható Osztály

Dobható osztály rendelkezik néhány konstruktorral és módszerrel a láncolt kivételek támogatására. Először nézzük meg a kivitelezőket.

  • Dobható (dobható ok)Dobható egyetlen paramétere van, amely meghatározza a tényleges okát Kivétel.
  • Dobható (karakterlánc desc, dobható ok)ez a konstruktor elfogad egy Kivétel leírás az an tényleges okával Kivétel is.

Ezután nézzük meg az osztály által kínált módszereket:

  • getCause () módszer - Ez a módszer visszatér az áramhoz társított tényleges okhoz Kivétel.
  • initCause () módszer - A hivatkozással megalapozza a mögöttes okot Kivétel.

4. Példa

Most nézzük meg azt a példát, ahol saját magunkat állítjuk be Kivétel leírást és láncra dobni Kivétel:

public class MyChainedException {public void main (String [] args) {try {dobjon új ArithmeticException-t ("Felső szintű kivétel".) .initCause (új IOException ("IO-ok".)); } catch (ArithmeticException ae) {System.out.println ("Elkapva:" + ae); System.out.println ("Tényleges ok:" + ae.getCause ()); }}}

Mint sejtettük, ez a következőkhöz fog vezetni:

Elkapva: java.lang.ArithmeticException: Legmagasabb szintű kivétel. Tényleges ok: java.io.IOException: IO okoz.

5. Miért láncolt kivételek?

Láncolni kell a kivételeket, hogy a naplók olvashatók legyenek. Írjunk két példát. Először a kivételek láncolása nélkül, másodszor pedig láncolt kivételekkel. Később összehasonlítjuk a naplók viselkedését mindkét esetben.

Először létrehozunk egy sor kivételt:

class NoLeaveGrantedException kiterjeszti a Kivételt {public NoLeaveGrantedException (String üzenet, Dobható ok) {super (üzenet, ok); } public NoLeaveGrantedException (String üzenet) {szuper (üzenet); }} class TeamLeadUpsetException kiterjeszti a kivételeket {// Mindkét konstruktor}

Most kezdjük el használni a fenti kivételeket a kódpéldákban.

5.1. Láncolás nélkül

Írjunk egy példa programot anélkül, hogy láncolnánk az egyedi kivételeket.

public class MainClass {public void main (String [] argument) dobja a Kivételt {getLeave (); } void getLeave () dobja a NoLeaveGrantedException {try {howIsTeamLead (); } catch (TeamLeadUpsetException e) {e.printStackTrace (); dob új NoLeaveGrantedException ("A szabadság nem szankcionálva."); }} void howIsTeamLead () dobja a TeamLeadUpsetException {dobjon új TeamLeadUpsetException-t ("Team Lead Upset"); }}

A fenti példában a naplók így fognak kinézni:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Csapatvezetõ ideges a com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:46) com.baeldung.chainexception.exceptions.eaveClass ) a com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) címen Kivétel a "main" com.baeldung.chainedexception.exceptions szálban. NoLeaveGrantedException: A szabadságot nem szankcionálták. itt: com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:37) itt: com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29)

5.2. Láncolással

Ezután írjunk egy példát az egyedi kivételek összekapcsolásával:

public class MainClass {public void main (String [] argument) dobja a Kivételt {getLeave (); } public getLeave () dobja a NoLeaveGrantedException {try {howIsTeamLead (); } catch (TeamLeadUpsetException e) {dobj új NoLeaveGrantedException-t ("A szabadság nem szankcionálva.", e); }} public void howIsTeamLead () dobja a TeamLeadUpsetException {dobja az új TeamLeadUpsetException szolgáltatást ("Team lead Upset."); }}

Végül nézzük meg a láncolt kivételekkel kapott rönköket:

Kivétel a "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException szálban: A szabadságot nem szankcionálták. itt: com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:36) itt: com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) : Csapatvezető ideges. itt: com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:44) a com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:34) ... 1 tovább

Könnyen összehasonlíthatjuk a bemutatott rönköket, és arra a következtetésre juthatunk, hogy a láncolt kivételek tisztább rönkhöz vezetnek.

Ebben a cikkben megvizsgáltuk a láncolt kivételek fogalmát.

Az összes példa megvalósulása megtalálható a Github projektben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.