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

«Всегда полезно разрабатывать иерархию исключений в начале проекта»

После долгого чтения и исследования определение проверяемого и непроверяемого исключения становится вполне ясным.

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

  1. Создавайте собственные исключения верхнего уровня для конкретных приложений
    • MyAppRuntimeException
    • MyAppCheckedException
  2. Подкласс MyAppCheckedException со всеми вашими бизнес-исключениями, где вы хотите, чтобы вызывающий объект принял конкретное исключение. Например
    • TryWithADifferentInputException - это неправильный ввод, исправьте его.
    • TryAlternateServiceException - эта служба недоступна, но вы можете выбрать другую службу, которая будет выполнять эту работу.
  3. Аналогичным образом подклассифицируйте свое исключение времени выполнения, которое накручивается по спирали и фиксируется только чем-то вроде преобразователя исключений Spring и отображает соответствующее сообщение во внешнем интерфейсе.

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

0
hailMurphy 7 Мар 2014 в 18:14

2 ответа

Лучший ответ

Привет, привет, Мерфи и добро пожаловать в SO!

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

Например, исключение TryWithADifferentInputException можно легко заменить на IllegalArgumentException или, возможно, IllegalStateException. Я считаю, что в 99% случаев я могу справиться с уже существующими.

Что касается того, чтобы знать, каких исключений ожидать до того, как вы начнете писать код: сложные части вашей программы, такие как структура классов, алгоритмы, протоколы и т. Д., Должны быть продуманы и задокументированы, прежде чем вы фактически запустите свою IDE и получите практическую работу. . UML - распространенный способ сделать это. Во время этого процесса, пока вы пишете карандашом свой алгоритм или протокол, попробуйте посмотреть на пограничные случаи (что произойдет, когда это значение станет равным нулю? Что, если этот аргумент равен null? Будет ли мой алгоритм по-прежнему работать? Хорошо ! Будет ли он сломан? Исключение!) И играя в адвоката дьявола (что, если сетевое соединение прервется на полпути через мой протокол? Могу ли я восстановиться после этого, или это оставит меня в неустранимом состоянии?), Вы должны быть в состоянии видеть сценарии исключений .

Если вам действительно нужно создать собственные исключения, выведите их непосредственно из того предка, который вам кажется наиболее подходящим - Error, IllegalStateException, RuntimeException, IOException и т. Д. Не создавайте свою собственную полную иерархию, если нет сценария, в котором вам нужно < em> only перехватить все ваши собственные исключения и ни одно из стандартных. Честно говоря, я не вижу сценария, в котором это могло бы быть полезно.

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

0
BadIdeaException 7 Мар 2014 в 14:57

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

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

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

Что ж, надеюсь, вам будет ясно. до свидания

0
prieser 7 Мар 2014 в 15:14