Який бажаний спосіб кинути винятки в Magento?


45

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

  • Mage::throwException('Some Message')- 732 Використання
  • throw new Exception('Some Message')- 419 Використання
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Usage
    (потрібно створити Vendor_Module_Exceptionклас)

2
як ти знайшов підрахунок виконання? Я прошу цікавості, щоб це знати !!!
Rajeev K Tomy

1
@RajeevKTomy Я здогадуюсь грепу з командного рядка - щось на кшталт 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але, мабуть, це спроба створити унікальний тип виключення для кожного модуля. Не було б шкоди для його використання, оскільки це, по суті, фабрика, яка повертає екземпляр виключення для даного модуля, хоча (на момент написання цього запису) він не реалізує жодної підтримки для таких речей, як скасування.


Мені подобаються ваші міркування тут - це простою англійською мовою :)
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тип виключення.

Говоріть про терміни ... менше 10 секунд. :)
davidalger

Міркування про перевагу між new Exception()і Mage::exception()мені в кращому випадку не зрозуміло. Коли я переглядаю Mage::exception()код, я не бачу жодної переваги throw $exception, він фактично перешкоджає вам вибирати клас винятків, для якого налаштовано стандартне автоматичне завантаження для ((/ /)) розширення, оскільки воно префіксує ім'я класу, перешкоджає статичному аналізу та не дозволяє викликати додаткові методи за винятком, коли він кидає безпосередньо.
хакре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.