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


46

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

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


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

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

4
@LawrenceCherone Ты прав. Никакое программное обеспечение никогда не должно преднамеренно давать сбой; надо просто продолжать и посмотреть, что получится. / s
user253751

@immibis Хороший сарказм - это хорошо.
kodeart

Это потрясающий вопрос !!! Я никогда даже не рассматривал эту идею до сегодняшнего дня.
Рис Джонс

Ответы:


75

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

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

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

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


21

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


17

Абсолютно!!

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

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


7

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

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


2

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

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

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


Я не уверен, почему этот ответ опущен. Он обеспечивает корректный подход с использованием проверки параметров перед созданием объекта ( «сторожевой» метод ), который является хорошим способом разработки ваших классов / функций для определенных (обычно бизнес) правил. Если также не отвечает прямо на вопрос ОП, но это все же хороший совет :)
kodeart
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.