Возможно ли в Java перехватить два исключения в одном блоке catch? [Дубликат]

    

На этот вопрос уже есть ответ здесь:

    

Мне нужно поймать два исключения, потому что они требуют одинаковой логики обработки. Я хотел бы сделать что-то вроде:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

Можно ли избежать дублирования кода обработчика в каждом блоке перехвата?

105 голосов | спросил user710818 26 J0000006Europe/Moscow 2012, 19:56:50

5 ответов


0

Java 7 и более поздние версии

Поддерживаются множественные исключения , начиная с Java 7.

Синтаксис:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

Статический тип ex является наиболее специализированным распространенным супертипом из перечисленных исключений. Есть хорошая возможность, когда вы перебрасываете ex в перехватчике, компилятор знает, что может быть выдано только одно из перечисленных исключений.


Java 6 и более ранние версии

До Java 7 были способы решения этой проблемы, но они, как правило, не элегантны и имеют ограничения.

Подход № 1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

Это запутывается, если обработчику исключений требуется доступ к локальным переменным, объявленным до try. И если метод-обработчик должен перебросить исключение (и оно проверено), то вы столкнетесь с серьезными проблемами с подписью. В частности, handleException должен быть объявлен как выбрасывающий SuperException ... что потенциально означает, что вы должны изменить сигнатуру включающего метода и т. д.

Подход № 2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

Еще раз, у нас есть потенциальная проблема с подписями.

Подход № 3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

Если вы пропустите часть else (например, потому что нет других подтипов SuperException на данный момент) код становится более хрупким. Если иерархия исключений будет реорганизована, этот обработчик без else может в конечном итоге молча поглощать исключения!

ответил Stephen C 26 J0000006Europe/Moscow 2012, 19:58:45
0

Если вы не используете Java 7, вы можете извлечь обработку исключений в метод - таким образом вы, по крайней мере, сможете минимизировать дублирование

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
ответил jeff 26 J0000006Europe/Moscow 2012, 20:04:54
0

Для Java <7 вы можете использовать if-else вместе с Exception:

try {
    // common logic to handle both exceptions
} catch (Exception ex) {
    if (ex instanceof Exception1 || ex instanceof Exception2) {

    }
    else {
        throw ex;
        // or if you don't want to have to declare Exception use
        // throw new RuntimeException(ex);
    }
}

Отредактировано и заменено на Throwable с исключением.

ответил Sarel Botha 26 J0000006Europe/Moscow 2012, 22:14:19
0

До запуска Java SE 7 мы обычно писали код с несколькими операторами catch, связанными с блоком try. Очень простой пример:

 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}

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

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}

Таким образом, несколько исключений в одном предложении catch не только упрощают код, но и уменьшают избыточность кода. Я нашел эту статью, которая объясняет эту функцию очень хорошо вместе с ее реализацией. Улучшенная и улучшенная обработка исключений из Java 7 Это тоже может вам помочь.

ответил Saurab Parakh 31 Jpm1000000pmFri, 31 Jan 2014 23:56:21 +040014 2014, 23:56:21
0

http://docs.oracle.com/javase/tutorial/essential /exceptions /catch.html описывает перехват нескольких исключений в одном блоке.

 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}

Я делаю учебные карточки, и эта ветка была полезна, просто хотел положить мои два цента.

ответил Eli 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 22:15:52 +0400000000pmFri, 08 Feb 2013 22:15:52 +040013 2013, 22:15:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132