Рубрики
Без рубрики

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

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

Автор оригинала: baeldung.

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.baeldung.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.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24)
Caused by: java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18)

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

4. Заключение

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

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

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