Когда бросать исключения? - PullRequest
2 голосов
/ 31 марта 2010

Исключения - замечательные вещи, но я иногда волнуюсь, что бросаю слишком много. Рассмотрим этот пример:

Класс пользователя {

  public function User(user){

    // Query database for user data

    if(!user) throw new ExistenceException('User not found');

  }

}

Я бы сказал, что имеет смысл просто возвращать false (или устанавливать все пользовательские данные в false в этом случае), а не выдавать исключение.

Что вы предпочитаете?

Ответы [ 4 ]

4 голосов
/ 31 марта 2010

Выдает исключение в исключительных случаях.

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

В вашем случае возврат false имеет больше смысла (или, возможно, используйте пустой объект как возвращаемое значение).

1 голос
/ 31 марта 2010

Используйте исключения, когда что-то действительно плохое или неожиданно случается . Как правило, вы хотите вызвать исключение, когда у вас есть неисправимая ошибка , которая может оставить состояние вашего кода в несовместимом состоянии . Иногда вы также хотите вызвать исключение, чтобы остановить создание объекта, когда конструктору был передан недопустимый аргумент (IllegalArgumentException). Все это исключительные случаи.

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

1 голос
/ 31 марта 2010

Вот мое эмпирическое правило

  • нормальная программная логика - используйте коды возврата и параметры
  • что-то необычное произошло - используйте исключение.
1 голос
/ 31 марта 2010

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

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

Конечно, в некоторых языках есть несколько случаев, когда у вас мало выбора. Например, конструкторы c ++ не могут иметь возвращаемого значения, и, вероятно, плохо иметь частично сконструированный объект, поэтому иногда лучшим является выбрасывание исключения.

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

...