php — должен ли я вызывать исключение из конструктора?
Задавать вопрос
спросил
Изменено 5 лет, 11 месяцев назад
Просмотрено 24к раз
Я знаю, что могу выдать исключение из конструктора в PHP, но должен ли я это делать? Например, если значение параметра не такое, как я ожидал.
Или мне следует отложить создание исключения до вызова метода. Каковы преимущества и недостатки в обоих случаях?
- php
- объектно-ориентированный
- исключения
- обработка исключений
Зачем откладывать создание исключения?
Если вы знаете, что объект не может правильно создать экземпляр с заданными параметрами, вам определенно следует создать исключение.
В противном случае кто-то может проверить ваш объект на нуль, что им не является, и предположить, что все прошло как положено.
Есть много вещей, которые можно сделать с вашим объектом, не вызывая для него метод: его можно добавить в список, его можно сравнить, его можно отправить в качестве параметра и т. д. и т. д. Все эти вещи, которые не должны были произойти, учитывая, что это недействительный объект.
Если ваш конструктор вызывается с неверными параметрами, вы должны (должны?) генерировать исключение. Если вы этого не сделаете, вы можете получить плохой объект, который не будет вести себя так, как ожидалось.
Абсолютно!!
Вы должны создать исключение, если параметры для создания объекта недействительны или не соответствуют контракту. Не рекомендуется продолжать выполнение потока, зная, что объект создан с использованием неверных данных, которые могут вызвать
Всегда лучше «ПОТЕРЯТЬ БЫСТРО И ЗАРАНЕЕ»
Я знаю, что могу выдать исключение из конструктора в PHP, но должен ли я это делать?
Это единственный разумный способ сообщить, что строительство объекта не удалось.
Почему бы вам не проверить набор параметров перед созданием экземпляра вашего объекта? Это гарантирует, что ваш объект будет создан, тем самым устраняя любые побочные эффекты, которые могут возникнуть в результате его сбоя.
Хотя я знаю, что вы можете проверять что-то в своем конструкторе и выбрасывать исключения, я предпочитаю писать свои конструкторы таким образом, чтобы они не давали сбоев. Я выполняю проверку параметров перед созданием экземпляров объектов, которые затем могу выбрасывать исключения без сбоя моих конструкторов. Я также обычно не пытаюсь создавать экземпляры новых объектов в моих конструкторах, предпочитая вместо этого создавать экземпляры по мере необходимости.
Только мое мнение. PHP предлагает много свободы — наслаждайтесь!
1Иерархия классов исключений PHP
В прошлом понять иерархию классов исключений PHP было легко, но эта иерархия содержала довольно серьезный недостаток. В старых версиях PHP часто оказывалось сложным, если не невозможным, обрабатывать фатальные ошибки. На самом деле, большинство фатальных ошибок обычно приводили к полной остановке выполнения приложения. Теперь, благодаря изменениям, внесенным в PHP 7, исключения генерируются (и, следовательно, могут быть перехвачены) при возникновении фатальной ошибки, что позволяет приложению продолжать работу.
Начиная с PHP 7, PHP делит ошибки на два уникальных класса: Exception
и Error
. Ошибка
обычно используется для проблем, которые исторически считались фатальными ошибками. При возникновении фатальной ошибки PHP теперь выдает экземпляр класса Error
. Экземпляр Exception
, с другой стороны, генерируется для более традиционных, восстанавливаемых ошибок.
Чтобы объединить эти две концепции, PHP 7 представляет новый Throwable 9.0068, который реализован как
Exception
, так и Error
. Вот посмотрите на всю иерархию исключений PHP:
- Throwable
- Ошибка
- Арифметическая ошибка
- DivisionByZeroError
- Ошибка утверждения
- ParseError
- TypeError
- Арифметическая ошибка
- Исключение
- ClosedGeneratorException
- DOMException
- Исключение ошибки
- IntlException
- Логикексцептион
- BadFunctionCallException
- BadMethodCallException
- Исключение домена
- ИнвалидАргументИсключение
- Длина исключения
- OutOfRangeException
- BadFunctionCallException
- ФарИсключение
ReflectionException- Исключение среды выполнения
- mysqli_sql_exception
- OutOfBoundsException
- Исключение переполнения
- PDOException
- RangeException
- UnderflowException
- UnexpectedValueException
- Ошибка
Ниже мы кратко обсудим каждый тип исключения верхнего уровня, предоставив грубый обзор, который мы подробнее остановим в следующих статьях.
Как обсуждалось ранее, Ошибки
охватывают проблемы, которые обычно считаются фатальными. Такие ошибки считаются
ошибками PHP.
-
ArithmeticError
— Возникает при попытке выполнения недопустимых математических операций, таких как выполнение отрицательного битового сдвига или попытка получить результат за пределамицелого числа
. -
AssertionError
— Возникает, когда утверждение, сделанное с помощьюassert()
, не удается. -
ParseError
— Возникает при недопустимой попытке синтаксического анализа, например, с помощью функцииeval()
. -
TypeError
— Возникает, когда предоставленные типы аргументов или возвращаемых значений не соответствуют объявленному ожидаемому типу.
Исключения
охватывают все пользовательские исключения в PHP — все, что не является внутренней ошибкой
, считается Exception
.
-
ClosedGeneratorException
— Выброшено при попытке запросить другое значение у генератора, у которого больше нет значений для предоставления, и поэтому он был завершен. -
DOMException
— Возникает, когда что-то идет не так с манипулированием документами в стиле XML. -
ErrorException
— используется для преобразования исключенияError
в исключениеException
. -
IntlException
— Возникает при возникновении проблемы с выполнением логики интернационализации. -
LogicException
— Возникает при выполнении ошибочной программной логики. -
PharException
— Возникает при возникновении проблемы при манипулировании однофайловыми файловыми архивами приложений PHP, обычно обозначаемыми какphars
. -
ReflectionException
— Возникает при попытке выполнить недопустимую операцию во время отражения.