Qual è il modo preferito di generare eccezioni in Magento?
-
16-10-2019 - |
Domanda
Tutti i seguenti metodi sono utilizzati nel nucleo Magento affermativo, qual è il preferito (o l'ultimo "best practice") modo?
-
Mage::throwException('Some Message')
- 732 Usi -
throw new Exception('Some Message')
- 419 Usi -
throw Mage::exception('Vendor_Module', 'Some Message')
- 94 Usi
(necessità di creare una classeVendor_Module_Exception
)
Soluzione
Il Mage::throwException
chiamata viene utilizzata per generare eccezioni della varietà specifica Mage_Core_Exception
. Questi sono generalmente utilizzati per presentare i messaggi di errore per l'utente finale. Per esempi di questo, fare una rapida ricerca per Mage::throwException
nel modulo Mage_Checkout, troverete molti casi in cui il messaggio di errore sia effettivamente tradotto prima che sia gettato, come è in ultima analisi, sta per essere aggiunto all'oggetto sessione e visualizzato all'utente sulla pagina risultante.
Utilizzando new Exception
o qualcosa di simile new My_Custom_Exception
sarebbe normalmente in cui si sta gettando errori interni per l'applicazione, errori che molto probabilmente non dovrebbe mai essere visualizzati per l'utente finale. Forse si cattura questi e gestire con grazia (buon uso per un tipo di eccezione personalizzata in alcuni casi), o altre volte finiscono fuori pescato, il login e terminare la richiesta con un messaggio di errore più generico viene visualizzato all'utente.
Non ho mai usato personalmente Mage::exception
ma sembra essere un tentativo di avere un modello tipo di eccezione unica per ogni modulo. Non ci sarebbe niente di male a usarlo, in quanto è essenzialmente una fabbrica che restituisce un'istanza un'eccezione per il modulo dato, anche se (al momento della stesura di questo) non implementa alcun supporto per cose come sostituzioni.
Altri suggerimenti
Hai fatto la parte più difficile, scoprire quanto spesso vengono usati:)
tl; dr: IMHO, è necessario utilizzare Mage::throwException
il più delle volte, per poi tornare ad Mage::exception
quando è necessario sollevare un tipo di eccezione al di fuori del campo di applicazione del modulo, se per nessun altro motivo che la capacità di messaggistica sessione e il fatto che non è necessario digitare throw new
di fronte ad esso.
Ecco la ripartizione:
-
Mage::throwException
è essenzialmente un wrapper perMage_Core_Exception($message)
con le funzionalità aggiuntive di essere in grado di aggiungere l'eccezione a una sessione tramite una chiamatagetSingleton
concatenato conaddMessage
-
new Exception()
è il modo più core di PHP per generare un'eccezione, ma richiede di utilizzare la parola chiavethrow
ed è probabilmente la più piccola grande più "performante", come gli altri due sono gli involucri con funzionalità extra. - Come accennato,
Mage::exception
è un wrapper pure, ma ha il vantaggio di permettere di un'istanza la propria classe eccezione. Si tratta di veramente utile se sei uno sviluppatore del plugin e necessità di fare i registri personalizzati per eccezioni, separatamente, senza la funzionalità che forniscelogException
(ad esempio, senza pila trac) o desidera effettuare una chiamata API su eccezione, ecc E 'anche utile quando si desiderathrow
un'eccezione di un tipo di classe diversa, per esempio, ciò che accade inMage_Paypal
, alzando spesso un tipo di eccezioneMage_Core
.