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 utilisationsthrow new Exception('Some Message')
- 419 utilisationsthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 Usages
(nécessité de créer uneVendor_Module_Exception
classe)
error
best-practice
exception
Salman von Abbas
la source
la source
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.Réponses:
L'appel
Mage::throwException
est utilisé pour lancer des exceptions d'uneMage_Core_Exception
varié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 rapideMage::throwException
dans 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 Exception
ou quelque chose comme celanew My_Custom_Exception
serait 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::exception
mais 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.la source
Mage::throwException('my error message')
dans ma classe d'assistance mais rien ne se passe ??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::throwException
plus souvent, en retombantMage::exception
quand 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 à taperthrow new
devant.Voici la ventilation:
Mage::throwException
est essentiellement un wrapperMage_Core_Exception($message)
avec la fonctionnalité supplémentaire de pouvoir ajouter l’exception à une session via ungetSingleton
appel chaîné avecaddMessage
new Exception()
PHP est le moyen principal de lancer une exception, mais vous oblige à utiliser lethrow
mot clé. Il est probablement le plus gros "plus performant" car les deux autres sont des wrappers dotés de fonctionnalités supplémentaires.Mage::exception
est é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éslogException
fournies (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 voulezthrow
une exception d'un type de classe différent, par exemple, ce qui se passe dansMage_Paypal
, soulevant fréquemment unMage_Core
type d'exception.la source
new Exception()
etMage::exception()
n'est pas clair pour moi au mieux. Quand je regarde dans leMage::exception()
code, je ne vois aucun avantagethrow $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.