Какой предпочтительный способ создания исключений в Magento?

45

Все следующие методы используются в ядре Magento, так какой из них является предпочтительным (или новейшим «лучшим методом»)?

  • Mage::throwException('Some Message')- 732 использования
  • throw new Exception('Some Message')- 419 использований
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 использования
    (необходимо создать Vendor_Module_Exceptionкласс)
Салман фон Аббас
источник
2
как вы нашли количество выполнений? Я прошу любопытства узнать это !!!
Раджив К Томи
1
@RajeevKTomy Я предполагаю, что grep из командной строки - что-то вроде 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- хотя это требует, чтобы вы знали, что тоже искать.
Даг Маклин

Ответы:

36

Вызов Mage::throwExceptionиспользуется для выдачи исключений определенного Mage_Core_Exceptionсорта. Они обычно используются для представления сообщений об ошибках конечному пользователю. Для примеров этого, сделайте быстрый поиск Mage::throwExceptionв модуле Mage_Checkout, вы найдете много случаев, когда сообщение об ошибке фактически транслируется перед его выбросом, так как в конечном итоге оно будет добавлено к объекту сеанса и отображено пользователю на итоговая страница.

Использование new Exceptionили что-то подобное, как new My_Custom_Exceptionправило, происходит там, где вы генерируете внутренние ошибки приложения, ошибки, которые, скорее всего, никогда не должны отображаться конечному пользователю. Может быть, вы ловите их и обрабатываете их изящно (в некоторых случаях полезно для пользовательского типа исключения), или в других случаях они заканчиваются перехватом, записываются в журнал и завершают запрос с отображением пользователю более общего сообщения об ошибке.

Я никогда не использовал Mage::exceptionего лично, но, похоже, это попытка создать уникальный тип исключения для каждого модуля. При его использовании не было бы никакого вреда, поскольку по сути это фабрика, которая возвращает экземпляр исключения для данного модуля, хотя (на момент написания этой статьи) она не реализовала никакой поддержки для таких вещей, как переопределения.

davidalger
источник
Мне нравятся ваши рассуждения здесь - это на простом английском :)
philwinkle
Я позвонил Mage::throwException('my error message')в свой класс помощников, но ничего не происходит?
черный
16

Вы сделали сложную часть, выяснив, как часто они используются :)

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тип исключения.
philwinkle
источник
Разговор о времени ... менее чем за 10 секунд. :)
Давидгер
Обоснование предпочтения между new Exception()и Mage::exception()мне не совсем понятно в лучшем случае. Когда я изучаю Mage::exception()код, я не вижу никакой выгоды по сравнению с ним throw $exception, он фактически мешает вам выбрать класс исключения, для которого вы настроили стандартную автоматическую загрузку в расширении (ваше / an), так как он содержит префикс имени класса, препятствует статическому анализу и не позволяет вызывать дополнительные методы на исключение при его непосредственном вызове.
15:00