Круто или глупо? Поймать (Исключение [NamingException, CreateException] e)

Я писал код и заметил закономерность в обработке исключений, которая заставила меня задуматься:

try{

        // do stuff... throws JMS, Create and NamingException

} catch (NamingException e) {

        log1(e);
    rollback();
        doSomething(e)
} catch (CreateException e) {

        log1(e);
    rollback();
        doSomething(e)
}

Где JMSException будет обрабатывать где-то в стеке.

Было бы просто написать:

try{

        // do stuff... throws JMS, Create and NamingException
} catch Exception[NamingException, CreateException] e) {

        log1(e);
    rollback();
        doSomething(e)
}

вместо того, чтобы помещать его в вспомогательный метод:

try{

        // do stuff... throws JMS, Create and NamingException
} catch (NamingException e) {

        helper_handleError1(e)
} catch (CreateException e) {

        helper_handleError1(e)
}

Обратите внимание, что я хочу распространить трассировку стека исходного JMSException, и мне не «хочется» создавать новое исключение JMSException с третьим предложением catch :)

Какие-нибудь крутые? Это крайняя ситуация, которая только загрязняет синтаксис Java, или это просто классная вещь, которую нужно добавить?

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

Ответы 8

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

try {
  ...
} catch ((IOException && !FileNotFoundException) || IllegalArgumentException ) {
  ... handle it
}

Я предлагаю использовать идиому «Execute Around».

Что такое идиома «Казнь вокруг»?

Avi 04.12.2008 17:40

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

Greg Case 04.12.2008 17:52

Ави: Хороший вопрос. stackoverflow.com/questions/341971/…

Tom Hawtin - tackline 04.12.2008 23:39

Грег: Я не вижу этого в исходном вопросе, и все равно не вижу в этом проблемы.

Tom Hawtin - tackline 04.12.2008 23:39

Попробуй это:

try {
  ...
} catch ( Exception e) {
  if typeof(e) not in ('MyException', 'SpecialException') {
    throw e
  }
  doSomething()
}

(псевдокод)

Он выглядит хорошо как псевдокод, но не очень практичен при преобразовании в реальный код; (

Marko 04.12.2008 17:40

На первом месте,

} catch Exception[NamingException, CreateException] e) {

не хватает символа '(' char.

Во-вторых, почему «Exception [NamingException, CreateException] e», а не просто «[NamingException, CreateException] e»?

Идея может быть приятной, но требует доработки. Например, предположим, что я объявляю класс MyException с функцией doYellow () и класс OtherException с функцией doYellow (). Разрешена ли такая функция (учитывая, что в суперклассе нет функции doYellow ())? Если да, то можно ли было бы объявить doYellow () только для одного из них? Это то, что «Исключение» перед символами []? Также предположим, что есть это объявление:

void doYellow(NamingException e);
void doYellow(CreateException e);

(обратите внимание, что это разные функции) будет ли разрешено называться?

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

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

Они рассматривают возможность расширения этого типа для Java 7.

См .: http://tech.puredanger.com/java7#catch

Другой способ сделать.

Преобразуйте исключение низкого уровня в собственное исключение высокого уровня и обработайте его.

try{
    try{
        // do stuff... throws JMS, Create and NamingException
    } catch (NamingException e) {
            throw new MyException(e);
    } catch (CreateException e) {
            throw new MyException(e);
    }
} catch (MyException e) {
    // something on e or e.getCause();
}

Почему не просто

try
{
   // do stuff... throws JMS, Create and NamingException
}  catch (JMSException e) 
{   
   if (e instanceof CreateException || e instanceof NamingExcption)
   {    
     log1(e);
     rollback();
     doSomething(e);
   }
   else
     throw e;
}

Иногда вы можете не захотеть этого делать по двум причинам. 1. У них может не быть одного и того же общего родительского исключения. 2. Класс повторной генерации не может быть проверенным исключением, объявленным в интерфейсе.

Dennis C 04.12.2008 17:53

Пока мы придумываем синтаксис, вот каким я хотел бы это видеть:

try
{
   // do stuff ...
}
catch (NamingException e)
catch (CreateException e)
{
   log1(e);
   rollback();
   doSoemthing(e);
}

Подобно провалу оператора switch или блока C# using. Конечно, здесь проблема с дважды объявленной переменной e, но я думаю, что что-то можно решить.

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