Каков предпочтительный способ бросить исключения в Magento?
-
16-10-2019 - |
Вопрос
Все следующие методы используются в ядре Magento, так какой из них является предпочтительным (или последним способом «лучшей практики»)?
Mage::throwException('Some Message')
- 732 использованияthrow new Exception('Some Message')
- 419 использованияthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 использования
(нужно создатьVendor_Module_Exception
учебный класс)
Решение
Звонок Mage::throwException
используется, чтобы добавить исключения конкретных Mage_Core_Exception
разнообразие. Обычно они используются для представления сообщений об ошибках конечному пользователю. Для примеров этого, сделайте быстрый поиск Mage::throwException
В модуле MAGE_CHECKOUT вы найдете много случаев, когда сообщение об ошибке фактически переводится до его брошенного, так как оно в конечном итоге будет добавлено в объект сеанса и отображается пользователю на полученной странице.
С использованием new Exception
или что -то вроде new My_Custom_Exception
Обычно будет то, где вы бросаете ошибки внутренними в приложение, ошибки, которые, скорее всего, никогда не должны отображаться конечному пользователю. Возможно, вы поймаете их и обрабатываете их изящно (хорошее использование для пользовательского типа исключений в некоторых случаях), или в других случаях они заканчивают пойманными, регистрировали и завершают запрос с более общим сообщением об ошибке, отображаемому пользователю.
Я никогда не использовал лично Mage::exception
Но это, по -видимому, является попыткой сэмплекса с уникальным типом исключений для каждого модуля. При использовании его не пострадала, так как это, по сути, фабрика, которая возвращает экземпляр исключения для данного модуля, хотя (на момент написания этой статьи) он не оказывает никакой поддержки для таких вещей, как переопределение.
Другие советы
Вы сделали сложную часть, выяснив, как часто они используются :)
TL; DR: ИМХО, вы должны использовать Mage::throwException
чаще всего возвращается к Mage::exception
Когда вам нужно поднять тип исключения из -за пределов объема вашего модуля, если по какой -либо другой причине, кроме способности обмена сеансами и тот факт, что вам не нужно печатать throw new
перед ним.
Вот срыв:
Mage::throwException
По сути, это обертка дляMage_Core_Exception($message)
с дополнительной функцией возможности добавить исключение из сеанса черезgetSingleton
Позвоните в цепью сaddMessage
new Exception()
это основной способ PHP, чтобы сделать исключение, но требует от вас использоватьthrow
Ключевое слово и, вероятно, является малейшим большим более «исполнительским», поскольку два других являются обертками с дополнительной функциональностью.- Как уже упоминалось,
Mage::exception
это также обертка, но имеет преимущество, что позволяет вам создать свой собственный класс исключений. Это Действительно полезно Если вы разработчик плагинов и вам нужно делать пользовательские журналы для исключений, отдельно, без функциональности, которыеlogException
обеспечивает (например, нет стека Trac) или хочет сделать вызов API на исключение и т. Д. Это также удобно, когда вы хотитеthrow
Например, исключение различного типа класса, что происходит вMage_Paypal
, часто поднимаяMage_Core
Тип исключения.