Перейти к основному содержимому

Обертывание и повторное создание исключений в Java

· 2 мин. чтения

1. Обзор

Ключевое слово throw в Java используется для явного создания пользовательского исключения или встроенного исключения. Но иногда в блоке catch нам нужно снова вызвать то же самое исключение. Это приводит к повторному созданию исключения.

В этом руководстве мы обсудим два наиболее распространенных способа повторного создания исключения.

2. Повторное создание исключений

Иногда перед распространением исключения на более высокий уровень мы можем захотеть выполнить некоторые действия. Например, мы можем захотеть откатить транзакцию БД, зарегистрировать исключение или отправить электронное письмо.

Мы можем выполнять такие действия в блоке catch и повторно вызывать исключение. Таким образом, более высокий уровень получает уведомление о том, что в системе произошло исключение.

Давайте разберем наш случай на примере.

Ниже мы повторно выбрасываем одно и то же исключение. И мы записываем сообщение об ошибке непосредственно перед его генерацией:

String name = null;

try {
return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
// log
throw e;
}

Консоль покажет следующее сообщение:

Exception in thread "main" java.lang.NullPointerException
at com.foreach.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

Как мы видим, наш код просто повторно генерирует любое перехваченное исключение. Из-за этого мы получаем исходную трассировку стека без каких-либо изменений .

3. Обтекание исключений

Теперь давайте рассмотрим другой подход.

В этом случае мы передадим то же исключение в качестве ссылки в конструкторе другого исключения:

String name = null;

try {
return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
// log
throw new IllegalArgumentException(e);
}

Консоль отобразит:

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException
at com.foreach.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24)
Caused by: java.lang.NullPointerException
at com.foreach.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18)

На этот раз мы видим исходное исключение, а также обертку. Таким образом, наш экземпляр IllegalArgumentException оборачивает исходное исключение NullPointerException в качестве причины . Следовательно, мы можем показать более конкретное исключение вместо общего.

4. Вывод

В этой короткой статье мы представили основное различие между повторным генерированием исходного исключения и его первой оболочкой. Оба способа отличаются друг от друга способом отображения сообщения об исключении .

Основываясь на нашем требовании, мы можем либо повторно сгенерировать одно и то же исключение, либо обернуть его каким-то конкретным исключением, используя второй подход. Второй подход выглядит чище и упрощает откат исключения .

Как всегда, проект доступен на GitHub .