Обработка исключений сложна в любом приложении.Вы должны подумать о каждом исключении и быстро найти шаблон, который работает для вас.Я пытаюсь сгруппировать исключения в одну из следующих категорий ...
- Исключения, которые должны произойти, только если ваш код неверен (или вы не понимаете, или у вас нетконтроль над ними):
Пример: Может быть, ваша среда персистентности требует, чтобы вы перехватывали исключения SQL, которые могут возникнуть из-за некорректного SQL, однако вы выполняете сложныйзакодированный запрос.
Обработка: По моему опыту, большинство исключений попадают в эту категорию.По крайней мере, зарегистрируйте их.Более того, отправьте их в службу обработки исключений, которая регистрирует их.Тогда в будущем, если вы решите, что хотите записать их по-другому или сделать что-то с ними по-другому, вы можете изменить это в одном месте.Может быть, вы также хотите отправить флаг до уровня пользовательского интерфейса, сообщая, что произошла какая-то ошибка, и они должны повторить свою работу.Возможно, вы отправляете письмо администратору.
Вам также нужно будет что-то вернуть на более высокие уровни, чтобы жизнь на сервере продолжалась.Может быть, это значение по умолчанию, или, может быть, это ноль.Возможно, у вас есть какой-то способ отменить всю операцию.
Другой вариант - предоставить службе обработки исключений два метода обработки.Метод handleUnexpectedException()
будет уведомлять пользователя, но не выбрасывать исключение, и тогда вы сможете вернуть значение по умолчанию, если у вас есть возможность размотать стек самостоятельно или продолжить каким-либо образом.Метод handleFatalException()
уведомил бы пользователя и перебросил какое-то исключение, чтобы вы могли разрешить выбрасыванию исключения перевернуть стек для вас.
- Исключения, которые фактически вызваны пользователем:
Пример: Пользователь пытается обновить виджет foobar и присвоить ему новое имя, но виджет foobar уже существует с тем именем, которое он хочет.
Обработка: В этом случае вам необходимо вернуть исключение пользователю.В этом случае вы можете продолжать и продолжать генерировать исключение (или, лучше, даже не перехватывать его), пока оно не достигнет уровня пользовательского интерфейса, а затем уровень пользовательского интерфейса должен знать, как обрабатывать исключение.Обязательно задокументируйте эти исключения, чтобы вы (или кто-то, кто пишет ваш пользовательский интерфейс) знали, что они существуют, и знали, что их ожидать.
- Исключения, которые вы можете обработать:
Пример: Вы делаете удаленный вызов службы, и время удаленного обслуживания истекает, но вы знаете, что у них есть история этого, и вы должны просто повторить вызов.
Обработка: Иногда эти исключения начинаются в первой категории.После того, как ваше приложение какое-то время находилось в дикой природе, вы понимаете, что у вас действительно есть хороший способ его обработать.Иногда, как с исключениями из оптимистической блокировки или прерывистыми исключениями, перехват исключения и выполнение с ним каких-либо действий - это просто часть бизнеса.В этих случаях обработайте исключение.Если ваш язык (я думаю, что Java) различает проверенные и непроверенные исключения, я бы рекомендовал всегда проверять исключения.
Чтобы ответить на поставленный выше вопрос, я бы делегировал начальное исключение службе, которая уведомитпользователь и в зависимости от того, какой объект MyObj (например, настройки), я мог бы разрешить это как нефатальное исключение и вернуть значение по умолчанию или, если я не могу сделать это (например, учетную запись пользователя), то я мог бы позволить этому бытьфатальное исключение, поэтому мне не нужно об этом беспокоиться.