Ланцюгові винятки в Java дозволяють асоціювати один виняток з іншим, тобто один виняток описує причину іншого винятку.
- Наприклад, розглянемо ситуацію, коли метод викидає an ArithmeticException через спробу поділити на нуль.
- Але основною причиною помилки була помилка введення-виведення, через яку дільник став нульовим.
- У таких випадках ланцюгові винятки допомагають поширювати як основну, так і глибинну причини помилки.
приклад : наступний приклад демонструє, як використовувати ланцюгові винятки в 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()); } } }
Вихід
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
Примітка: Ланцюгові винятки, також відомі як вкладені винятки, дозволяють нам пов’язати причину з винятком у Java. Це корисно, коли ми хочемо поширити інформацію про початкову причину винятку.
Конструктори
- Throwable (Throwable Причина) : Де причина — виняток, який викликає поточний виняток.
- Throwable(String msg Throwable Причина) : де msg — це повідомлення про виняток, а причина — це виняток, який викликає поточний виняток.
Методи Throwable, що підтримують ланцюгові винятки
- getCause() : Цей метод повертає фактичну причину виняткової ситуації.
- initCause (можлива причина) : Цей метод встановлює причину виняткової ситуації виклику.
приклад: Використання спеціального повідомлення з приєднаними винятками
У Java ми можемо ланцюгувати винятки за допомогою конструктора класу 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); } } }
Вихід:
рядок порожній
Пояснення: У цьому прикладі масив цілих чисел і встановлює дільник на 0.
- Усередині блоку try він намагається розділити кожен елемент масиву на 0, що викликає ArithmeticException.
- Ця виняткова ситуація ArithmeticException перехоплюється в блок catch, де створюється нова виняткова ситуація RuntimeException із початковою винятковою ситуацією, тобто ArithmeticException як її причина.
- Оскільки RuntimeException не перехоплюється, відображається трасування стека, включаючи RuntimeException і ArithmeticException.
Переваги зв'язаних винятків:
Нижче наведено переваги зв’язаних винятків:
- Цей виняток допомагає в налагодженні, надаючи докладні відомості про основні та основні причини.
- Це спрощує обробку помилок, дозволяючи розповсюджувати повний контекст виняткової ситуації.
- Це покращує відстеження помилок у складних програмах.
Недоліки ланцюгових винятків:
- Якщо не використовувати належним чином, трасування стека може стати довшим і важчим для читання.
- Надмірне використання може призвести до незрозумілих повідомлень про помилки, якщо винятки непотрібно зв’язуються.
- Розробники повинні переконатися, що вагомі причини пов’язані між собою; інакше це може ввести в оману під час налагодження.