Когда использовать multi-catch, а когда использовать rethrow?

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

private void something(String name) throws IOException, RemoteException {
    try {
        ...
    } catch (Exception ex) {

        ... // do something

        throw ex;
    }
}

3 ответа

Решение

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

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

Rethrow

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

Скажем, какой-то метод callSomething() вызывает ваш метод что-то (). Если какое-либо исключение возникает внутри что-то (), оно просто перехватит исключение, поэтому приложение не завершится сбоем, и переместит его в метод callSomething(). Затем callSomething() уведомит клиента о внутренней ошибке.

Другим примером является то, что в шаблоне MVC запрос, отправленный клиентом, обслуживается каким-либо методом из контроллера на основе сопоставления запроса. Контроллер вызовет службу, а служба будет взаимодействовать с каким-либо методом dao. Если в DAO возникает какое-то исключение, то DAO перебрасывает исключение в службу, служба перебрасывает в контроллер, и именно контроллер уведомляет клиента о сообщении об ошибке. Это известно как распространение исключений в Java. Исключение распространяется от метода к методу, вверх по стеку вызовов, пока не будет перехвачено.

Мульти поймать

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

Вам нужно будет сбросить в следующих ситуациях

  1. Вы хотите что-то предварительно обработать, прежде чем исключение покинет метод. Однако, если вам не важен тип исключения, тогда предварительную обработку можно выполнить в finally блок тоже.
  2. Вы пытаетесь преобразовать отмеченные исключения в непроверенное исключение. В этом случае вы будете ловить все исключения как catch(Exception ex) и отбрасывая их как throw new RuntimeException(ex),
  3. Вы хотите, чтобы ваши пользовательские исключения создавались вместо встроенных. Таким образом, вы перехватите все исключения, а затем создадите свой собственный объект исключения, предпочтительно не отмеченный, и выбросите его. Многие API-интерфейсы делают это, например Spring преобразует неинтуитивно JDBC исключения из пользовательских исключений Spring.
  4. Это что-то вроде предварительной обработки. Вы хотите отслеживать все исключения, создаваемые ArrayList или чем-то еще, чтобы в конце программы, состоящей из нескольких шагов, вы знали, какие шаги генерируют исключения. Я видел, что этот используется в Talend сгенерированный код Java.
Другие вопросы по тегам