Обработка исключений в отдельном методе для удобства чтения - PullRequest
2 голосов
/ 27 марта 2019

Это анти-шаблон для обработки исключений в отдельном методе?

Скажем, у меня есть метод, который выполняет какой-то низкоуровневый ввод-вывод и может вызвать IOException, и у меня есть метод foo (), которыйвызывает метод ввода-вывода низкого уровня несколько раз.Имеет ли смысл выполнять обработку исключений в третьем методе, например так:

 public void foo()  throws MyCheckedException {
     // some stuff
     goDoSomeIO(path1)
    // some other stuff
     goDoSomeIO(path2)
    // some more stuff
     goDoSomeIO(path3)

  }

 private String goDoSomeIO(String filePath) throws MyCheckedException {
     try {
         doSomeIO(filePath);
     } catch (IOException ioe) {
         LOG.error("Io failed at: " + filePath);
         throw new MyCheckedException("Process failed because io failed", ioe)
     }
  }

 private String doSomeIO(String filepath) throws IOException {
        //io stuff
  }

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

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

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

Это довольно распространено и связано с отдельными проблемами: вещи низкого уровня заботятся о перемещении файлов, вещи высокого уровня ловят исключения, чтобы определить, работает сложная операция или нет. Я не думаю, что есть что-то плохое в том, чтобы поместить обработку ввода-вывода и обработку ввода-вывода в разные методы. (Я бы попытался дать им какое-нибудь имя, которое объясняет цель, однако. Я не фанат goDoWhothing & doWh независимо)

2 голосов
/ 27 марта 2019

Общее правило перехвата [проверенного] исключения - делать это, когда вы можете восстановиться после возникшей «исключительной» ситуации.Если вы не можете восстановиться после исключения, дайте ему всплыть до уровня, при котором его можно восстановить .Например, уведомите пользователя о том, что выбранный файл не читается, и разрешите пользователю снова выбрать файл.Или отправить 404 «страницу» запрашивающей стороне, когда фактически запрашиваемая страница не существует.

Effective Java, Item 58

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

Это на самом деле про-шаблон для добавления дополнительных деталей к исключению и его повторного выброса.

...