Was ist die bevorzugte Methode zum Auslösen von Ausnahmen in Magento?

45

Alle folgenden Methoden werden in Magento Core verwendet. Welche ist die bevorzugte (oder die neueste "Best Practice") Methode?

  • Mage::throwException('Some Message')- 732 Verwendungen
  • throw new Exception('Some Message')- 419 Verwendungen
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Verwendungen
    (müssen eine Vendor_Module_ExceptionKlasse erstellen )
Salman von Abbas
quelle
2
Wie haben Sie die Anzahl der Hinrichtungen gefunden? Ich bitte um Neugier, es zu wissen !!!
Rajeev K Tomy
1
@ RajeevKTomy Ich vermute ein Grep von der Kommandozeile - so etwas wie 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.
Doug McLean

Antworten:

36

Der Aufruf Mage::throwExceptionwird verwendet, um Ausnahmen der bestimmten Mage_Core_ExceptionSorte auszulösen. Diese werden im Allgemeinen verwendet, um dem Endbenutzer Fehlermeldungen anzuzeigen. Wenn Sie beispielsweise Mage::throwExceptionim 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 Exceptionoder ähnlichem werden new My_Custom_Exceptionnormalerweise 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::exceptionaber 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.

Davidalger
quelle
Ich mag Ihre Argumentation hier - es ist in einfachem Englisch :)
Philwinkle
Ich habe Mage::throwException('my error message')in meiner Helferklasse angerufen, aber nichts passiert?
Black
16

Sie haben den schwierigen Teil erledigt und herausgefunden, wie oft sie verwendet werden :)

tl; dr: IMHO sollten Sie Mage::throwExceptionam häufigsten verwenden und dabei darauf zurückgreifen, Mage::exceptionwann 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üssen throw newdavor tippen .

Hier ist die Aufteilung:

  • Mage::throwExceptionist im Wesentlichen ein Wrapper für Mage_Core_Exception($message)die zusätzliche Funktionalität, die Ausnahme zu einer Sitzung über einen getSingletonmit verketteten Aufruf hinzufügen zu könnenaddMessage
  • new Exception()Dies ist die wichtigste PHP-Methode, um eine Ausnahme auszulösen, erfordert jedoch die Verwendung des throwSchlüsselworts und ist wahrscheinlich die geringste größere Leistung, da die anderen beiden Wrapper über zusätzliche Funktionen verfügen.
  • Wie bereits erwähnt, Mage::exceptionhandelt 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 die logExceptionbereitgestellten 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öchten throweine Ausnahme eines anderen Klassentyps auslösen, z. B. was in passiert Mage_Paypal, und häufig einen Mage_CoreAusnahmetyp auslösen.
Philwinkle
quelle
Sprechen Sie über das Timing ... weniger als 10 Sekunden auseinander. :)
Davidalger
Die Begründung der Präferenz zwischen new Exception()und Mage::exception()ist mir allenfalls unklar. Wenn ich mich mit Mage::exception()Code befasse, sehe ich keinen Vorteil gegenüber throw $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.
Hakre