Reťazené výnimky v Jave

1. Prehľad

V tomto článku sa veľmi stručne pozrieme na to, čo Výnimka je a pôjde do hĺbky o diskusii o pripútaných výnimkách v Jave.

Jednoducho povedané, výnimkou je udalosť, ktorá narúša normálny priebeh vykonávania programu. Pozrime sa teraz, ako presne môžeme spojiť výnimky, aby sme z nich dostali lepšiu sémantiku.

2. Reťazené výnimky

Spútaný Výnimka pomáha identifikovať situáciu, v ktorej jedna výnimka spôsobuje inú Výnimka v aplikácii.

Zvážte napríklad metódu, ktorá hodí Aritmetická výnimka z dôvodu pokusu o rozdelenie na nulu, ale skutočnou príčinou výnimky bola chyba I / O, ktorá spôsobila, že deliteľ bude nula. Metóda vyvolá Aritmetická výnimka volajúcemu. Volajúci by nevedel o skutočnej príčine chyby Výnimka. Spútaný Výnimka sa používa v takýchto situáciách.

Tento koncept bol predstavený v JDK 1.4.

Pozrime sa, ako sú v Jave podporované reťazené výnimky.

3. Hoditeľné Trieda

Hoditeľné trieda má niektoré konštruktory a metódy na podporu pripútaných výnimiek. Najprv sa pozrime na konštruktérov.

  • Hoditeľné (hoditeľná príčina)Hoditeľné má jediný parameter, ktorý určuje skutočnú príčinu súboru Výnimka.
  • Hádzateľné (reťazec desc, hádzateľná príčina)tento konštruktér prijíma Výnimka popis so skutočnou príčinou Výnimka tiež.

Ďalej sa pozrime na metódy, ktoré táto trieda poskytuje:

  • getCause () metóda - Táto metóda vracia skutočnú príčinu spojenú s prúdom Výnimka.
  • initCause () metóda - Nastavuje základnú príčinu vyvolaním Výnimka.

4. Príklad

Teraz sa pozrime na príklad, kde si nastavíme svoj vlastný Výnimka popis a hodiť pripútaný Výnimka:

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 ("Skutočná príčina:" + ae.getCause ()); }}}

Podľa odhadov to povedie k:

Zachytené: java.lang.ArithmeticException: výnimka najvyššej úrovne. Skutočná príčina: java.io.IOException: IO Cause.

5. Prečo reťazené výnimky?

Potrebujeme reťaziť výnimky, aby boli protokoly čitateľné. Napíšme si dva príklady. Prvý bez reťazenia výnimiek a druhý s reťazenými výnimkami. Neskôr porovnáme, ako sa protokoly správajú v obidvoch prípadoch.

Na začiatok vytvoríme sériu výnimiek:

trieda NoLeaveGrantedException rozširuje výnimku {public NoLeaveGrantedException (reťazcová správa, hoditeľná príčina) {super (správa, príčina); } public NoLeaveGrantedException (reťazcová správa) {super (správa); }} trieda TeamLeadUpsetException rozširuje výnimku {// Both Constructors}

Teraz začnime používať vyššie uvedené výnimky v príkladoch kódu.

5.1. Bez reťazenia

Poďme si napísať ukážkový program bez toho, aby sme reťazili naše vlastné výnimky.

public class MainClass {public void main (String [] args) vyvolá výnimku {getLeave (); } void getLeave () hodí NoLeaveGrantedException {try {howIsTeamLead (); } chytit (TeamLeadUpsetException e) {e.printStackTrace (); hodiť novú NoLeaveGrantedException ("Nechajte sankcionované."); }} void howIsTeamLead () hodí TeamLeadUpsetException {hodiť novú TeamLeadUpsetException ("Upset vedúceho tímu"); }}

Vo vyššie uvedenom príklade budú protokoly vyzerať takto:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Team lead Upset na com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:46) na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java34) ) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Výnimka vo vlákne "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: Nechajte sankcionované. na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:37) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29)

5.2. S reťazením

Ďalej si napíšeme príklad s reťazením našich vlastných výnimiek:

public class MainClass {public void main (String [] args) vyvolá výnimku {getLeave (); } public getLeave () hodí NoLeaveGrantedException {try {howIsTeamLead (); } catch (TeamLeadUpsetException e) {hodiť novú NoLeaveGrantedException ("Nechajte sankciu.", e); }} public void howIsTeamLead () hodí TeamLeadUpsetException {hodiť novú TeamLeadUpsetException ("Upset vedúceho tímu."); }}

Na záver sa pozrime na protokoly získané s pripútanými výnimkami:

Výnimka vo vlákne „hlavný“ com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Nechajte sankcionované. na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:36) na com.baeldung.chainedexception.exceptions.MainClass .main (MainClass.java:29) Spôsobené: com.baeldung.chainedexception.exceptions .TeamLeadUpsetException : Vedenie tímu rozrušené. na com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead (MainClass.java:44) na com.baeldung.chainedexception.exceptions.MainClass .getLeave (MainClass.java:34) ... ešte 1

Môžeme ľahko porovnať zobrazené protokoly a dospieť k záveru, že spútané výnimky vedú k čistejším protokolom.

V tomto článku sme sa pozreli na koncept reťazených výnimiek.

Implementáciu všetkých príkladov možno nájsť v projekte Github - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found