Alle folgenden Methoden werden in Magento Core verwendet. Welche ist die bevorzugte (oder die neueste "Best Practice") Methode?
Mage::throwException('Some Message')
- 732 Verwendungenthrow new Exception('Some Message')
- 419 Verwendungenthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 Verwendungen
(müssen eineVendor_Module_Exception
Klasse erstellen )
error
best-practice
exception
Salman von Abbas
quelle
quelle
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
- obwohl das erfordert, dass Sie wissen, wonach Sie auch suchen.Antworten:
Der Aufruf
Mage::throwException
wird verwendet, um Ausnahmen der bestimmtenMage_Core_Exception
Sorte auszulösen. Diese werden im Allgemeinen verwendet, um dem Endbenutzer Fehlermeldungen anzuzeigen. Wenn Sie beispielsweiseMage::throwException
im Modul Mage_Checkout nach einer kurzen Suche suchen, werden Sie in vielen Fällen feststellen, dass die Fehlermeldung tatsächlich übersetzt wird, bevor sie ausgegeben wird, da sie letztendlich dem Sitzungsobjekt hinzugefügt und dem Benutzer angezeigt wird die resultierende Seite.Bei Verwendung von
new Exception
oder ähnlichem werdennew My_Custom_Exception
normalerweise Fehler innerhalb der Anwendung ausgegeben, die dem Endbenutzer höchstwahrscheinlich nie angezeigt werden sollten. Vielleicht können Sie diese abfangen und ordnungsgemäß verarbeiten (in einigen Fällen ist dies für einen benutzerdefinierten Ausnahmetyp sinnvoll), oder Sie beenden die Anforderung mit einer allgemeineren Fehlermeldung, die dem Benutzer angezeigt wird.Ich habe es noch nie persönlich benutzt,
Mage::exception
aber es scheint ein Versuch zu sein, ein Muster mit einem eindeutigen Ausnahmetyp für jedes Modul zu erstellen. Die Verwendung würde keinen Schaden anrichten, da es sich im Wesentlichen um eine Factory handelt, die eine Ausnahmeinstanz für das angegebene Modul zurückgibt, obwohl sie (zum Zeitpunkt dieses Schreibens) keine Unterstützung für Dinge wie Überschreibungen implementiert.quelle
Mage::throwException('my error message')
in meiner Helferklasse angerufen, aber nichts passiert?Sie haben den schwierigen Teil erledigt und herausgefunden, wie oft sie verwendet werden :)
tl; dr: IMHO sollten Sie
Mage::throwException
am häufigsten verwenden und dabei darauf zurückgreifen,Mage::exception
wann Sie einen Ausnahmetyp von außerhalb des Bereichs Ihres Moduls auslösen müssen, und zwar aus keinem anderen Grund als der Fähigkeit zur Sitzungsnachrichtenübermittlung und der Tatsache, dass Sie dies nicht tun müssenthrow new
davor tippen .Hier ist die Aufteilung:
Mage::throwException
ist im Wesentlichen ein Wrapper fürMage_Core_Exception($message)
die zusätzliche Funktionalität, die Ausnahme zu einer Sitzung über einengetSingleton
mit verketteten Aufruf hinzufügen zu könnenaddMessage
new Exception()
Dies ist die wichtigste PHP-Methode, um eine Ausnahme auszulösen, erfordert jedoch die Verwendung desthrow
Schlüsselworts und ist wahrscheinlich die geringste größere Leistung, da die anderen beiden Wrapper über zusätzliche Funktionen verfügen.Mage::exception
handelt es sich ebenfalls um einen Wrapper, bietet jedoch den Vorteil, dass Sie Ihre eigene Ausnahmeklasse instanziieren können. Dies ist sehr hilfreich, wenn Sie ein Plug-in-Entwickler sind und benutzerdefinierte Protokolle für Ausnahmen separat erstellen müssen, ohne dielogException
bereitgestellten Funktionen (z. B. kein Stack-Trac) oder einen API-Aufruf für Ausnahmen usw. ausführen möchten. Dies ist auch praktisch, wenn Sie möchtenthrow
eine Ausnahme eines anderen Klassentyps auslösen, z. B. was in passiertMage_Paypal
, und häufig einenMage_Core
Ausnahmetyp auslösen.quelle
new Exception()
undMage::exception()
ist mir allenfalls unklar. Wenn ich mich mitMage::exception()
Code befasse, sehe ich keinen Vorteil gegenüberthrow $exception
. Es hindert Sie tatsächlich daran, die Ausnahmeklasse zu wählen, für die Sie das automatische Standardladen in (Ihrer / einer) Erweiterung konfiguriert haben, da sie dem Klassennamen voranstellt, die statische Analyse behindert und ermöglicht es Ihnen nicht, zusätzliche Methoden für die Ausnahme aufzurufen, die direkt ausgelöst wird.