Reťazené výnimky v jazyku Java umožňujú priradiť jednu výnimku k inej, t. j. jedna výnimka popisuje príčinu inej výnimky.
- Uvažujme napríklad o situácii, v ktorej metóda vyhodí an Aritmetická výnimka kvôli pokusu deliť nulou.
- Ale hlavnou príčinou chyby bolo zlyhanie I/O, ktoré spôsobilo, že deliteľ bol nula.
- V takýchto prípadoch zreťazené výnimky pomáhajú šíriť primárne aj základné príčiny chyby.
Príklad : Nasledujúci príklad ukazuje, ako používať zreťazené výnimky v jazyku Java.
Java// Working of chained exceptions public class Geeks { public static void main(String[] args) { try { // Creating an exception NumberFormatException ex = new NumberFormatException('Primary Exception'); // Setting the cause of the exception ex.initCause(new NullPointerException('Root cause of the exception')); // Throwing the exception with a cause throw ex; } catch (NumberFormatException ex) { // Displaying the primary exception System.out.println('Caught Exception: ' + ex); // Displaying the root cause of the exception System.out.println('Cause of Exception: ' + ex.getCause()); } } }
Výstup
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
Poznámka: Zreťazené výnimky známe aj ako vnorené výnimky nám umožňujú spojiť príčinu s výnimkou v jazyku Java. Je to užitočné, keď chceme šíriť informácie o pôvodnej príčine výnimky.
Konštruktéri
- Hodiť sa (príčina odhodenia) : Kde príčina je výnimka, ktorá spôsobuje aktuálnu výnimku.
- Vhoditeľné (príčina vhadzovania reťazcov) : Kde msg je správa o výnimke a príčina je výnimka, ktorá spôsobuje aktuálnu výnimku.
Metódy vrhateľných podporných reťazených výnimiek
- getCause() : Táto metóda vráti skutočnú príčinu výnimky.
- initCause (možná príčina) : Táto metóda nastavuje príčinu volania výnimky.
Príklad: Používanie vlastnej správy so zreťazenými výnimkami
V Jave môžeme zreťaziť výnimky pomocou konštruktora triedy Throwable.
Java// Use a custom message with chained exception public class Geeks { public static void main(String[] args) { try { // Code that might throw an exception int[] n = new int[5]; int divisor = 0; for (int i = 0; i < n.length; i++) { int res = n[i] / divisor; System.out.println(res); } } catch (ArithmeticException e) { // Creating a new exception with // the original as the cause throw new RuntimeException ('Error: Division by zero occurred' e); } } }
výstup:
pandy a numpy
Vysvetlenie: V tomto príklade pole celých čísel a nastaví deliteľa na 0.
- Vo vnútri bloku try sa pokúsi vydeliť každý prvok poľa číslom 0, čo vyvolá výnimku ArithmeticException.
- Táto výnimka ArithmeticException je zachytená v bloku catch, kde sa vytvorí nová výnimka RuntimeException s pôvodnou výnimkou, t. j. ako jej príčinou je výnimka ArithmeticException.
- Pretože nie je zachytená výnimka RuntimeException, ktorá zobrazuje stopu zásobníka vrátane výnimiek RuntimeException a ArithmeticException.
Výhody zreťazených výnimiek:
Výhody zreťazených výnimiek sú uvedené nižšie:
- Táto výnimka pomáha pri ladení poskytovaním podrobností o primárnych aj základných príčinách.
- Zjednodušuje spracovanie chýb tým, že umožňuje šírenie úplného kontextu výnimky.
- To zlepšuje sledovateľnosť chýb v zložitých aplikáciách.
Nevýhody zreťazených výnimiek:
- Ak sa nepoužíva správne, môže byť stopa zásobníka dlhšia a ťažšie čitateľná.
- Nadmerné používanie môže spôsobiť mätúce chybové hlásenia, ak sú výnimky zbytočne reťazené.
- Vývojári musia zabezpečiť prepojenie zmysluplných príčin; inak môže pri ladení zavádzať.