Quelle est la méthode préférée pour lancer des exceptions dans Magento?


45

Toutes les méthodes suivantes sont utilisées dans le noyau de Magento. Quelle est la méthode préférée (ou la "meilleure pratique" la plus récente)?

  • Mage::throwException('Some Message')- 732 utilisations
  • throw new Exception('Some Message')- 419 utilisations
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Usages
    (nécessité de créer une Vendor_Module_Exceptionclasse)

2
comment avez-vous trouvé le compte d'exception? Je vous le demande par curiosité pour le savoir !!!
Rajeev K Tomy

1
@RajeevKTomy Je devine un grep à partir de la ligne de commande - quelque chose comme 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- bien que cela nécessite que vous sachiez ce que vous cherchez aussi.
Doug McLean

Réponses:


36

L'appel Mage::throwExceptionest utilisé pour lancer des exceptions d'une Mage_Core_Exceptionvariété spécifique . Celles-ci sont généralement utilisées pour présenter des messages d'erreur à l'utilisateur final. Pour des exemples, faites une recherche rapide Mage::throwExceptiondans le module Mage_Checkout. Vous y trouverez de nombreuses instances où le message d'erreur est en cours de traduction avant d'être émis, car il sera finalement ajouté à l'objet de session et affiché à l'utilisateur sur. la page résultante.

En utilisant new Exceptionou quelque chose comme cela new My_Custom_Exceptionserait normalement où vous générez des erreurs internes à l'application, des erreurs qui ne devraient probablement jamais être affichées à l'utilisateur final. Peut-être pouvez-vous les récupérer et les manipuler avec élégance (bon usage pour un type d'exception personnalisé dans certains cas), ou à d'autres moments, ils finissent par être pris, consignés et terminent la demande avec un message d'erreur plus générique affiché à l'utilisateur.

Je ne l’ai jamais utilisé personnellement, Mage::exceptionmais cela semble être une tentative de configuration avec un type d’exception unique pour chaque module. Son utilisation ne serait pas préjudiciable, car il s'agit essentiellement d'une fabrique qui renvoie une instance d'exception pour le module donné, bien que (au moment de la rédaction de cet article), aucun support ne soit implémenté pour les remplacements.


J'aime votre raisonnement ici - c'est en anglais simple :)
philwinkle

J'ai appelé Mage::throwException('my error message')dans ma classe d'assistance mais rien ne se passe ??
Black

16

Vous avez fait la partie difficile, en découvrant combien de fois ils sont utilisés :)

tl; dr: à mon humble avis, vous devriez utiliser le Mage::throwExceptionplus souvent, en retombant Mage::exceptionquand vous avez besoin de lever un type d'exception en dehors de la portée de votre module, si pour aucune autre raison que la capacité de messagerie de session et le fait que vous ne le faites pas avoir à taper throw newdevant.

Voici la ventilation:

  • Mage::throwExceptionest essentiellement un wrapper Mage_Core_Exception($message)avec la fonctionnalité supplémentaire de pouvoir ajouter l’exception à une session via un getSingletonappel chaîné avecaddMessage
  • new Exception()PHP est le moyen principal de lancer une exception, mais vous oblige à utiliser le throwmot clé. Il est probablement le plus gros "plus performant" car les deux autres sont des wrappers dotés de fonctionnalités supplémentaires.
  • Comme mentionné, Mage::exceptionest également un wrapper, mais présente l’avantage de vous permettre d’instancier votre propre classe d’exception. Ceci est très utile si vous êtes un développeur de plug-in et que vous devez créer des journaux personnalisés pour les exceptions, séparément, sans les fonctionnalités logExceptionfournies (par exemple, pas de trace de pile) ou si vous souhaitez effectuer un appel d'API à une exception, etc. C'est également utile lorsque vous voulez throwune exception d'un type de classe différent, par exemple, ce qui se passe dans Mage_Paypal, soulevant fréquemment un Mage_Coretype d'exception.

Parlez de timing… moins de 10 secondes d'intervalle. :)
davidalger

Le raisonnement de préférence entre new Exception()et Mage::exception()n'est pas clair pour moi au mieux. Quand je regarde dans le Mage::exception()code, je ne vois aucun avantage throw $exception, cela vous empêche en fait de choisir la classe d’exception pour laquelle vous avez configuré le chargement automatique standard dans (votre / extension) car elle préfixe le nom de la classe, entrave l’analyse statique et ne vous permet pas d’appeler des méthodes supplémentaires sur l’exception lorsqu’il émet directement.
hakre
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.