¿Cuál es la forma preferida de lanzar excepciones en Magento?

45

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 usos
  • throw new Exception('Some Message')- 419 usos
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 usos
    (es necesario crear una Vendor_Module_Exceptionclase)
Salman von Abbas
fuente
2
¿Cómo encontró el recuento de ejecución? ¡Le pido curiosidad por saberlo!
Rajeev K Tomy
1
@RajeevKTomy Estoy adivinando un grep de la línea de comando, algo así 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.
Doug McLean

Respuestas:

36

La llamada Mage::throwExceptionse utiliza para lanzar excepciones de la Mage_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ápida Mage::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.

davidalger
fuente
Me gusta su razonamiento aquí, está en inglés simple :)
philwinkle
Llamé Mage::throwException('my error message')a mi clase de ayuda pero no pasa nada.
Negro
16

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 a Mage::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 escribir throw newdelante de él.

Aquí está el desglose:

  • Mage::throwExceptiones esencialmente un contenedor para Mage_Core_Exception($message)la funcionalidad adicional de poder agregar la excepción a una sesión a través de una getSingletonllamada encadenada conaddMessage
  • new Exception()es la forma principal de PHP de lanzar una excepción, pero requiere que use la throwpalabra clave y es probablemente el más grande "rendimiento", ya que los otros dos son envoltorios con funcionalidad adicional.
  • Como se mencionó, también 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 que logExceptionproporciona (por ejemplo, sin seguimiento de pila) o si desea hacer una llamada API en excepción, etc. También es útil cuando desea throwuna excepción de un tipo de clase diferente, por ejemplo, lo que sucede Mage_Paypal, generando frecuentemente un Mage_Coretipo de excepción.
philwinkle
fuente
Hable sobre el tiempo ... menos de 10 segundos de diferencia. :)
davidalger
El razonamiento de preferencia entre new Exception()y Mage::exception()no me resulta claro en el mejor de los casos. Cuando miro el Mage::exception()código, no veo ningún beneficio throw $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.
Hakre