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
您是如何找到执行次数的?
Rajeev K Tomy

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-尽管这要求您知道也要寻找什么。
Doug McLean 2015年

Answers:


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:恕我直言,您应该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异常类型。

谈论时间……相隔不到10秒。:)
davidalger

new Exception()和之间的偏好推理Mage::exception()最多对我来说还不清楚。当我研究Mage::exception()代码时,我看不出有什么好处throw $exception,它实际上阻碍了您选择已在(您//)扩展名中配置了标准自动加载功能的异常类,因为它以类名为前缀,阻碍了静态分析和不允许您直接在异常抛出时调用其他方法。
hakre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.