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.