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_Exceptionclase)
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::throwExceptionse utiliza para lanzar excepciones de laMage_Core_Exceptionvariedad específica . Generalmente se utilizan para presentar mensajes de error al usuario final. Para obtener ejemplos de esto, realice una búsqueda rápidaMage::throwExceptionen 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 Exceptiono algo asínew My_Custom_Exceptionnormalmente 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::exceptionpero 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::throwExceptionmayor frecuencia, recurriendo aMage::exceptioncuando 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 newdelante de él.Aquí está el desglose:
Mage::throwExceptiones esencialmente un contenedor paraMage_Core_Exception($message)la funcionalidad adicional de poder agregar la excepción a una sesión a través de unagetSingletonllamada encadenada conaddMessagenew Exception()es la forma principal de PHP de lanzar una excepción, pero requiere que use lathrowpalabra clave y es probablemente el más grande "rendimiento", ya que los otros dos son envoltorios con funcionalidad adicional.Mage::exceptiones 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 quelogExceptionproporciona (por ejemplo, sin seguimiento de pila) o si desea hacer una llamada API en excepción, etc. También es útil cuando deseathrowuna excepción de un tipo de clase diferente, por ejemplo, lo que sucedeMage_Paypal, generando frecuentemente unMage_Coretipo 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.