я должен бросить исключение из конструктора?

46

Я знаю, что я могу выбросить исключение из конструктора в PHP, но я должен это сделать? Например, если значение параметра не соответствует ожиданиям.

Или я должен отложить создание исключения до вызова метода. Каковы преимущества и недостатки в обоих случаях?

Вордсворт
источник
вопрос в том, хотите ли вы, чтобы ваши пользователи видели ужасные сообщения об ошибках исключений?
15
@LawrenceCherone нет, это не вопрос. Не за что. Вопрос заключается в том, следует ли немедленно вызывать исключение, когда ctor не может установить объект в допустимое состояние из переданных ему аргументов, или отложить его до тех пор, пока не будет вызван метод, работающий на этом экземпляре с возможным недопустимым состоянием. Хотя лучше подходит для программистов.
4
@LawrenceCherone Ты прав. Никакое программное обеспечение никогда не должно преднамеренно давать сбой; надо просто продолжать и посмотреть, что получится. / s
user253751
@immibis Хороший сарказм - это хорошо.
kodeart
Это потрясающий вопрос !!! Я никогда даже не рассматривал эту идею до сегодняшнего дня.
Рис Джонс

Ответы:

75

Зачем вам откладывать выбрасывание исключения?

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

В противном случае кто-то может проверить ваш объект на null, чего не будет, и предположить, что все прошло как ожидалось.

Есть много вещей, которые можно сделать с вашим объектом, не вызывая для него метод: он может быть добавлен в список, его можно сравнить, его можно отправить в качестве параметра и т. Д. И т. Д. И т. Д. Все это вещи этого не должно было случиться, учитывая, что это недопустимый объект.

Андрей Г
источник
21

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

Феликс Ганьон-Гренье
источник
17

Абсолютно!!

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

Это всегда лучше "FAIL FAST AND FAIL EARLY"

java_mouse
источник
7

Я знаю, что я могу выбросить исключение из конструктора в PHP, но я должен это сделать?

Это единственный разумный способ сообщить, что строительство объекта не удалось.

BЈовић
источник
2

Почему бы вам не проверить набор параметров до создания экземпляра вашего объекта? Это гарантирует, что ваш объект будет создан, таким образом, удаляя любые побочные эффекты, которые могут возникнуть в результате его отказа.

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

Просто мое мнение. PHP предлагает много свободы - наслаждайтесь!

Тони Мейс
источник
Я не уверен, почему этот ответ опущен. Он обеспечивает корректный подход с использованием проверки параметров перед созданием объекта ( «сторожевой» метод ), который является хорошим способом разработки ваших классов / функций для определенных (обычно бизнес) правил. Если также не отвечает прямо на вопрос ОП, но это все же хороший совет :)
kodeart