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


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

  • Mage::throwException('Some Message') - 732 Обычаи
  • throw new Exception('Some Message') - 419 Обычаи
  • throw Mage::exception('Vendor_Module', 'Some Message') - 94 Обычаи
    ( нужно создать класс Vendor_Module_Exception)
Author: Salman von Abbas, 2013-08-13

2 answers

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

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

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

 36
Author: davidalger, 2013-08-13 02:21:53

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

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.
 16
Author: philwinkle, 2013-08-13 02:22:05