Qual è il modo preferito di generare eccezioni in Magento?


45

Tutti i seguenti metodi sono usati nel core di Magento, quindi qual è il modo preferito (o l'ultimo "best practice")?

  • Mage::throwException('Some Message')- 732 Usi
  • throw new Exception('Some Message')- 419 Usi
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Usi
    (è necessario creare una Vendor_Module_Exceptionclasse)

2
come hai trovato il conteggio dell'esecuzione? Lo sto chiedendo per curiosità di saperlo !!!
Rajeev K Tomy,

1
@RajeevKTomy Sto indovinando un grep dalla riga di comando - qualcosa del genere 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- anche se questo richiede che tu sappia cosa anche cercare.
Doug McLean,

Risposte:


36

La chiamata Mage::throwExceptionviene utilizzata per generare eccezioni alla Mage_Core_Exceptionvarietà specifica . Questi sono generalmente utilizzati per presentare messaggi di errore all'utente finale. Per esempi di ciò, fai una rapida ricerca Mage::throwExceptionnel modulo Mage_Checkout, troverai molte istanze in cui il messaggio di errore viene effettivamente tradotto prima che venga lanciato, poiché alla fine verrà aggiunto all'oggetto sessione e visualizzato all'utente su la pagina risultante.

L'uso new Exceptiono qualcosa del genere new My_Custom_Exceptionsarebbe normalmente dove si generano errori interni all'applicazione, errori che molto probabilmente non dovrebbero mai essere visualizzati all'utente finale. Forse li prendi e li gestisci con garbo (buon uso per un tipo di eccezione personalizzato in alcuni casi), o altre volte finiscono catturati, registrati e terminano la richiesta con un messaggio di errore più generico che viene visualizzato all'utente.

Non l'ho mai usato personalmente Mage::exceptionma sembra essere un tentativo di creare un tipo di eccezione univoco per ciascun modulo. Non ci sarebbe nulla di male nell'usarlo, poiché è essenzialmente una fabbrica che restituisce un'istanza di eccezione per il modulo dato, sebbene (al momento della stesura di questo documento) non implementi alcun supporto per cose come le sostituzioni.


Mi piace il tuo ragionamento qui - è in un inglese semplice :)
Philwinkle il

Ho chiamato Mage::throwException('my error message')nella mia classe di aiuto, ma non succede nulla ??
Black

16

Hai fatto la parte difficile, scoprendo con che frequenza vengono usati :)

tl; dr: IMHO, dovresti usare Mage::throwExceptionpiù spesso, ricadendo a Mage::exceptionquando devi sollevare un tipo di eccezione dall'esterno del tuo modulo, se non altro per l'abilità di messaggistica di sessione e il fatto che non lo fai devi digitare throw newdavanti ad esso.

Ecco la ripartizione:

  • Mage::throwExceptionè essenzialmente un wrapper per Mage_Core_Exception($message)con la funzionalità aggiuntiva di poter aggiungere l'eccezione a una sessione tramite una getSingletonchiamata concatenataaddMessage
  • new Exception()è il modo principale di PHP di generare un'eccezione, ma richiede di utilizzare la throwparola chiave ed è probabilmente il più grande più "performante" in quanto gli altri due sono wrapper con funzionalità extra.
  • Come accennato, Mage::exceptionè anche un wrapper, ma ha il vantaggio di consentire di creare un'istanza della propria classe di eccezioni. Questo è davvero utile se sei uno sviluppatore di plug-in e hai bisogno di creare registri personalizzati per le eccezioni, separatamente, senza la funzionalità che logExceptionfornisce (ad esempio, nessuna traccia stack) o vuoi effettuare una chiamata API in eccezione, ecc. È anche utile quando vuoi throwun'eccezione di un diverso tipo di classe, ad esempio, cosa succede Mage_Paypal, sollevando frequentemente un Mage_Coretipo di eccezione.

Parla del tempismo ... a meno di 10 secondi di distanza. :)
davidalger,

Il ragionamento della preferenza tra new Exception()e Mage::exception()non mi è chiaro al massimo. Quando guardo il Mage::exception()codice, non vedo alcun vantaggio throw $exception, in realtà ti impedisce di scegliere la classe di eccezione per cui hai configurato il caricamento automatico standard per l'estensione (tua / an) in quanto prefigura il nome della classe, ostacola l'analisi statica e non ti consente di chiamare metodi aggiuntivi sull'eccezione che genera direttamente.
Hacre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.