Исключение цепочки в блоке catch

У меня есть следующий код Java:

 public void someMethod(){

    try{

        // some code which generates Exception

    }catch(Exception ex1) {

        try{

                // The code inside this method can also throw some Exception
                myRollBackMethodForUndoingSomeChanges();

        }catch(Exception ex2){
            // I want to add inside `ex2` the history of `ex1` too
            // Surely , I cannot set cause of `ex2` as `ex1` as `ex2`
            // can be caused by it's own reasons.
            // I dont want `ex1` details to be lost if I just throw `ex2` from my method



        }
    }

}

Как это сделать ?

РЕДАКТИРОВАТЬ : На самом деле это происходит на моем уровне обслуживания, и у меня есть совет контроллера для ведения журнала. Следовательно, я не хочу добавлять сюда 2 регистратора.

Почему вы не можете просто выбросить ex2, есть ли причина, по которой вы также хотите выбросить ex1? Если действительно необходимо, вы можете добавить дополнительное свойство rootCause к ex2 и при необходимости инициализировать его с помощью ex1.

Glains 24.10.2018 18:08

Не перехватывайте исключения времени выполнения - они сигнализируют о том, что вы как разработчик сделали что-то не так. Вместо этого определите, что вызывает сбой вашего кода во время выполнения, и исправьте это. См. stackoverflow.com/questions/3162760/…

Michael Peacock 24.10.2018 18:09

Я отредактировал вопрос.

Number945 24.10.2018 18:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить ex1 к подавленным исключениям в ex2 с помощью метода addSuppressed перед его повторным выбросом.

Пример быстрого кода:

public static void main(final String[] args) {
    try {
        throw new IllegalArgumentException("Illegal Argument 1!");
    } catch (final RuntimeException ex1) {
        try {
            throw new IllegalStateException("Illegal State 2!");
        } catch (final RuntimeException ex2) {
            ex2.addSuppressed(ex1);
            throw ex2;
        }
    }
}

выдаст исключение:

Exception in thread "main" java.lang.IllegalStateException: Illegal State 2!
    at package.main(Main.java:26)
    Suppressed: java.lang.IllegalArgumentException: Illegal Argument 1!
        at package.main(Main.java:20)

Другие вопросы по теме