Когда и почему я должен явно бросить исключение - PullRequest
5 голосов
/ 06 июля 2011

Я просто пытаюсь сделать мое понимание механизма исключения более ясным.
Если во время выполнения приложения что-то идет не так, среда выполнения автоматически выдает соответствующее исключение. Если это так, то почему я должен иногда проверять и явно выдавать конкретное исключение?
Как определить такие случаи (когда в коде должно быть явное исключение)?

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

Ответы [ 6 ]

6 голосов
/ 06 июля 2011

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

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

3 голосов
/ 06 июля 2011

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

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

3 голосов
/ 06 июля 2011

Как правило, мое правило заключается в том, что если произойдет ошибка, которую код, который я пишу, не может обработать, я сгенерирую исключение.Например, если я пишу функцию, которая принимает пару аргументов, и эта функция не имеет смысла, если аргументы null, я проверю это и выдам ArgumentNullException '

2 голосов
/ 06 июля 2011

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

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

2 голосов
/ 06 июля 2011

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

  1. Когда вам нужно остановить / изменить выполнение для сценария, который не будетвызвать какие-либо системные исключения (если foos с n столбцами, в которых система находится в беде, создайте пользовательское исключение)

  2. Когда вы находитесь на границе, где системное исключение будет включать данные, которыене было необходимости или, возможно, нежелательно выставлять (пользователям не нужно видеть все в трассировке стека, но вы можете зарегистрировать фактическое исключение, а затем создать собственное исключение (доступ к данным, доступ к службам и т. д.), которое позволяет вам контролировать то, чтораспространяется вниз по течению.

  3. Когда вы можете добавить дополнительную контекстную информацию к исключению, т.е. вы поймали какое-то исключение и можете использовать его как внутреннее исключение для нового исключения, которое включает информацию, которая может бытьполезно для регистрации / отладки и т. д.

0 голосов
/ 06 июля 2011

у каждого метода есть тип возвращаемого значения (будь то тип void, int, string, car и т. Д.). Исключение позволяет возвращать сообщение в вызывающий контекст, который НЕ имеет тип T, но имеет тип исключения, который говорит "что-то пошло не так". Что пошло не так, так это идентификация по производному типу (из исключения, как SQLException) и сообщению. Это создает единый интерфейс (по исключению типа) для сообщений об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...