Todos los siguientes métodos se utilizan en el núcleo de Magento, ¿cuál es la forma preferida (o la última "mejor práctica")?
Mage::throwException('Some Message')
- 732 usosthrow new Exception('Some Message')
- 419 usosthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 usos
(es necesario crear unaVendor_Module_Exception
clase)
error
best-practice
exception
Salman von Abbas
fuente
fuente
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
, aunque eso requiere que sepas lo que también debes buscar.Respuestas:
La llamada
Mage::throwException
se utiliza para lanzar excepciones de laMage_Core_Exception
variedad específica . Generalmente se utilizan para presentar mensajes de error al usuario final. Para obtener ejemplos de esto, realice una búsqueda rápidaMage::throwException
en el módulo Mage_Checkout, encontrará muchas instancias en las que el mensaje de error se está traduciendo antes de lanzarlo, ya que finalmente se agregará al objeto de sesión y se mostrará al usuario en La página resultante.El uso
new Exception
o algo asínew My_Custom_Exception
normalmente sería donde arroja errores internos a la aplicación, errores que probablemente nunca deberían mostrarse al usuario final. Tal vez los capte y los maneje con gracia (buen uso para un tipo de excepción personalizado en algunos casos), u otras veces terminen atrapados, registrados y finalicen la solicitud con un mensaje de error más genérico que se muestra al usuario.Nunca lo he usado personalmente,
Mage::exception
pero parece ser un intento de patrón que tiene un tipo de excepción único para cada módulo. No se haría ningún daño al usarlo, ya que es esencialmente una fábrica que devuelve una instancia de excepción para el módulo dado, aunque (en el momento de escribir este artículo) no implementa ningún soporte para cosas como anulaciones.fuente
Mage::throwException('my error message')
a mi clase de ayuda pero no pasa nada.Has hecho la parte difícil, descubriendo con qué frecuencia se usan :)
tl; dr: En mi humilde opinión, debe usarlo con
Mage::throwException
mayor frecuencia, recurriendo aMage::exception
cuando necesita elevar un tipo de excepción fuera del alcance de su módulo, si no es por otra razón que la capacidad de mensajería de sesión y el hecho de que no tiene que escribirthrow new
delante de él.Aquí está el desglose:
Mage::throwException
es esencialmente un contenedor paraMage_Core_Exception($message)
la funcionalidad adicional de poder agregar la excepción a una sesión a través de unagetSingleton
llamada encadenada conaddMessage
new Exception()
es la forma principal de PHP de lanzar una excepción, pero requiere que use lathrow
palabra clave y es probablemente el más grande "rendimiento", ya que los otros dos son envoltorios con funcionalidad adicional.Mage::exception
es un contenedor, pero tiene el beneficio de permitirle crear una instancia de su propia clase de excepción. Esto es realmente útil si es un desarrollador de complementos y necesita hacer registros personalizados para excepciones, por separado, sin la funcionalidad quelogException
proporciona (por ejemplo, sin seguimiento de pila) o si desea hacer una llamada API en excepción, etc. También es útil cuando deseathrow
una excepción de un tipo de clase diferente, por ejemplo, lo que sucedeMage_Paypal
, generando frecuentemente unMage_Core
tipo de excepción.fuente
new Exception()
yMage::exception()
no me resulta claro en el mejor de los casos. Cuando miro elMage::exception()
código, no veo ningún beneficiothrow $exception
, realmente te impide elegir la clase de excepción para la que has configurado la carga automática estándar en la extensión (tu / an), ya que antepone el nombre de la clase, dificulta el análisis estático y no le permite llamar a métodos adicionales en la excepción que arroja directamente.