Извлечение общего кода обработки исключений из нескольких методов в Java

#java #exception-handling

#java #исключение

Вопрос:

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

private void method1() { 
 попробуйте {
 //make_the_world_a_better_place
 } 
 catch(IOException ioe) {
 // ...
 }
}

частный логический метод2(строка str) {
 попробуйте {
 //make_a_cheesecake
 } 
 catch(IOException ioe) {
 // ...
 }
}

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

РЕДАКТИРОВАТЬ: Существует несколько предложений catch, а не только одно, как в примере.

Ответ №1:

Создайте интерфейс:

 public interface Executor {

  void exec() throws Exception;

}
  

в вашем классе:

 checkForExceptions(new Executor() {

  @Override
  public exex() throws Exception {

    method1();

  }

});

private void checkForExceptions(Executor ex) {
try {
  ex.exec();
} catch (Exception e) [
  /// handling
}
  

Комментарии:

1. Да, спасибо! Ваше решение является объектно-ориентированной альтернативой шаблонному методу. Но на самом деле я не хочу вводить новую иерархию классов для такой простой (?) задачи? Возможно ли повторно использовать код обработки исключений в том же классе? Я вижу, что мне нужно использовать анонимные классы, но в любом случае нужно ввести новый интерфейс.

2. Я боюсь, что нет, по крайней мере, в java 6. Если бы существовал lambda (ожидающий jdk 7), вам не понадобились бы никакие интерфейсы.

Ответ №2:

Ваш инстинкт верен — DRY — это хорошая вещь. Но не делайте этого. Ваш код будет сложнее читать.

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

Ответ №3:

Вы можете создать handleException(IOException ioe) метод, который они оба вызывают.

Комментарии:

1. Я думал о обработке try-catch в одном месте и логике метода между ними, но я думаю, что тогда мир был бы слишком совершенным. На самом деле у меня есть несколько предложений catch в методах…

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

3. Мой подход состоял бы в том, чтобы не создавать пользовательские исключения, просто пропустить исходные исключения и избежать множества блоков catch здесь и там.

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

5. Можете ли вы объяснить, почему? Возможно, это то, о чем вам не нужно беспокоиться. 😉

Ответ №4:

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