Все следующие методы используются в ядре Magento, так какой из них является предпочтительным (или новейшим «лучшим методом»)?
Mage::throwException('Some Message')
- 732 использованияthrow new Exception('Some Message')
- 419 использованийthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 использования
(необходимо создатьVendor_Module_Exception
класс)
error
best-practice
exception
Салман фон Аббас
источник
источник
grep -r throwException /path/to/magento/app/code/core | wc -l ; grep -r throw\ new /path/to/magento/app/code/core | wc -l ; grep -r throw\ Mage /path/to/magento/app/code/core | wc -l
- хотя это требует, чтобы вы знали, что тоже искать.Ответы:
Вызов
Mage::throwException
используется для выдачи исключений определенногоMage_Core_Exception
сорта. Они обычно используются для представления сообщений об ошибках конечному пользователю. Для примеров этого, сделайте быстрый поискMage::throwException
в модуле Mage_Checkout, вы найдете много случаев, когда сообщение об ошибке фактически транслируется перед его выбросом, так как в конечном итоге оно будет добавлено к объекту сеанса и отображено пользователю на итоговая страница.Использование
new Exception
или что-то подобное, какnew My_Custom_Exception
правило, происходит там, где вы генерируете внутренние ошибки приложения, ошибки, которые, скорее всего, никогда не должны отображаться конечному пользователю. Может быть, вы ловите их и обрабатываете их изящно (в некоторых случаях полезно для пользовательского типа исключения), или в других случаях они заканчиваются перехватом, записываются в журнал и завершают запрос с отображением пользователю более общего сообщения об ошибке.Я никогда не использовал
Mage::exception
его лично, но, похоже, это попытка создать уникальный тип исключения для каждого модуля. При его использовании не было бы никакого вреда, поскольку по сути это фабрика, которая возвращает экземпляр исключения для данного модуля, хотя (на момент написания этой статьи) она не реализовала никакой поддержки для таких вещей, как переопределения.источник
Mage::throwException('my error message')
в свой класс помощников, но ничего не происходит?Вы сделали сложную часть, выяснив, как часто они используются :)
tl; dr: IMHO, вы должны использовать
Mage::throwException
чаще всего, возвращаясь к тому,Mage::exception
когда вам нужно вызвать исключение из-за пределов области вашего модуля, если только по какой-либо другой причине, кроме возможности обмена сообщениями сеанса и того факта, что вы этого не делаете должны напечататьthrow new
перед ним.Вот разбивка:
Mage::throwException
по сути является оберткой дляMage_Core_Exception($message)
дополнительной функциональности, позволяющей добавлять исключение в сеанс черезgetSingleton
вызов, связанный сaddMessage
new Exception()
это основной способ создания исключения в PHP, но он требует использованияthrow
ключевого слова и, вероятно, является чуть-чуть более «быстрым», так как два других являются обертками с дополнительной функциональностью.Mage::exception
является оберткой, но имеет преимущество, позволяя вам создавать экземпляр своего собственного класса исключений. Это действительно полезно, если вы являетесь разработчиком плагинов и вам нужно создавать собственные журналы для исключений, отдельно, без функциональности, котораяlogException
обеспечивает (например, не отслеживание стека), или хотите сделать вызов API для исключения и т. Д. Это также удобно, когда вы хотитеthrow
исключение другого типа, например, что происходитMage_Paypal
, часто вызываяMage_Core
тип исключения.источник
new Exception()
иMage::exception()
мне не совсем понятно в лучшем случае. Когда я изучаюMage::exception()
код, я не вижу никакой выгоды по сравнению с нимthrow $exception
, он фактически мешает вам выбрать класс исключения, для которого вы настроили стандартную автоматическую загрузку в расширении (ваше / an), так как он содержит префикс имени класса, препятствует статическому анализу и не позволяет вызывать дополнительные методы на исключение при его непосредственном вызове.