Как добавить информацию о состоянии без написания повторяющегося кода при перехвате нескольких исключений Java? - PullRequest
3 голосов
/ 02 июля 2010

Я прочитал несколько других постов, таких как , этот о том, как избежать повторения в блоках Java catch. Очевидно, что я действительно хочу, это "multi-catch", но, учитывая, что Java 7 еще не пришла, есть хороший шаблон, позволяющий мне добавлять состояние в мои исключения, а затем перебрасывать их, без захвата кухонной раковиной ?

В частности, у меня есть некоторый код, который выполняет библиотечные вызовы, которые могут генерировать исключения, но не обеспечивают почти достаточный контекст для успешной отладки. Я обнаружил, что у меня возникла проблема: я захожу внутрь, оборачивая библиотечный вызов в try / catch, перехватывая конкретное исключение, затем добавляя дополнительную информацию о состоянии в блок catch и перебрасывая перехваченное исключение. Затем я повторяю этот цикл снова и снова, каждый раз находя новое условие ошибки для регистрации. У меня получается

try {
  make_library_call();
}
catch (SomeException e){
  throw new SomeException ("Needed local state information is " + importantInfo, e);
}
catch (SomeOtherException e){
  throw new SomeOtherException ("Needed local state information is " + importantInfo, e);
}
catch (YetAnotherException e){
  throw new YetAnotherException ("Needed local state information is " + importantInfo, e);
}

и т. Д. И т. Д. Я думаю, что я действительно хотел бы видеть больше по линии

try {
  make_lib_call();
}
catch(Exception e){
  e.AddSomeInformationSomehow("Needed Info" + importantInfo);
  throw e;
}

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

try{
  make_lib_call();
}
finally {
  if (/*an exception happened*/)
    logger.debug("Some state info: " + importantInfo);
}

но я не знаю, как написать условное. Это безумие / неправильно?

Ответы [ 2 ]

2 голосов
/ 02 июля 2010

Вы, вероятно, ожидаете этого, но нет , нет хорошего (и под хорошим я имею в виду чистый) способ сделать это.Вы, вероятно, ожидаете этого, потому что подсознательно знали, что если бы был хороший шаблон для этого, то, вероятно, не стоило бы добавлять его в Java 7.

Это на самом деле окончательное повторение функция, которую вы найдете в этом случае очень полезной.

2 голосов
/ 02 июля 2010

Для альтернативы:

boolean isOk = false;
try{
  make_lib_call();
  isOk = true;
}
finally {
  if (!isOk)
    logger.debug("Some state info: " + importantInfo);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...