Должны ли мы всегда ловить исключение, обернуть его и передать? - PullRequest
6 голосов
/ 08 февраля 2011

Я читал такой метод:

public void doSomething throws MyException{
    ...
    try {
         doSomthingElse();
    } catch (MyException e){
         log.errer(e.getMessage());
         throw new MyException(e.getMessage(),e);
    }
    ...
}

Но я предпочитаю:

public void doSomething throws MyException{
     ...
     doSomthingElse();         
     ...
}

Кто-нибудь знает причину первого метода? Существует только один тип исключений, и он не обрабатывается в этом методе, есть ли причина перехватывать его, оборачивать без новой информации, а затем передавать наверх? Почему бы просто не написать это вторым способом? Спасибо!

Ответы [ 5 ]

5 голосов
/ 08 февраля 2011

Регистрация исключения и его выдача на самом деле является анти-паттерном по нескольким причинам .Эмпирическое правило: если вы не можете сделать ничего полезного для обработки исключения (в большинстве случаев ведется запись , а не обрабатывает исключение), пусть ваш фреймворк / контейнер сделает это за вас.Если вы можете (например, использовать другое хранилище, когда база данных недоступна, ставить пакеты в очередь, когда сеть не работает), зарегистрируйте исключение и продолжайте (всегда не забывайте также записывать в стек).

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

2 голосов
/ 08 февраля 2011

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

Миско Хивери - тоже хорошее прочтение на эту тему.

1 голос
/ 08 февраля 2011

Причиной для этой "обертки" в вашем примере может быть не когда-либо пропустить исключение и, по крайней мере, записать его.Я не вижу другого смысла в этом catch блоке, так как обычно он объявляется для восстановления после исключения и, возможно, выполняет «надлежащую очистку».

Я предпочитаю наследовать пользовательский класс исключений от существующего исключения.

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

0 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

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

...