Eccezioni in PHP: Try / Catch o set_exception_handler?

Sto sviluppando un codice di fine inferiore nel mio sistema che utilizza più classi figlie della class di eccezioni php. Essenzialmente ho le eccezioni suddivise in poche categorie. Quello che voglio fare è due cose.

  1. Ho bisogno di tutte le eccezioni che vengono lanciate nell'applicazione per essere gestite in un unico posto.
  2. Devo essere in grado di accedere e quindi gestire / generare la vista affinché l'utente possa ricevere feedback sulle app. errore.

Quello che mi chiedo è se wheressi avere una sorta di try / catch che incapsula l'applicazione? Non mi piace affatto questa idea, sembra un'implementazione molto schifosa. Inoltre, non mi piace l'idea di set_exception_handler a less che non possa impostare la function come metodo di un object. La ragione di ciò è che se si designa una function per gestire le eccezioni, questa sarà la prima function nell'applicazione. Tutto il resto è un metodo di un object.

Spero di aver fornito abbastanza dettagli sullo scenario. Sto cercando di mantenere questo pulito e seguire le migliori pratiche. Questo codice andrà in OSS quindi non ho voglia di scriverlo 10 volte 🙂

  1. Esegui le tue richieste web attraverso uno script di Front Controller
  2. chiama set_exception_handler all'inizio (non dimenticarti di account error_reporting() ). set_exception_handler prende come parametro ciò che php chiama "callback" . Puoi passare un metodo object in questo modo:

     // $object->methodName() will be called on errors set_exception_handler(arrays($object, 'methodName')); 
  3. Avvolgi il tuo codice di spedizione con try/catch per catturare qualsiasi codice che genera eccezioni. La parte catch del tuo codice catturerà tutte le eccezioni dei tuoi stessi codici, oltre ad alcuni errori php che non hanno generato un'exception in modo nativo (es. fopen o qualcosa del genere), grazie alla tua chiamata set_exception_handler sopra. Il manuale php afferma:

    I seguenti tipi di errore non possono essere gestiti con una function definita dall'utente: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING e la maggior parte di E_STRICT generati nel file in cui viene chiamato set_error_handler ().

  4. Registrare gli errori se necessario.

  5. Crea un model di pagina di errore (la "Vista") che opera su un object Eccezione (il "Modello") e printing graziosamente l'intera traccia dello stack per te, in fase di sviluppo. Crea un model diverso che va in produzione. Ramo sul tuo ambiente, ad esempio:

     catch(Exception $e) { // log error as necessary here. if("in developement") { // $e would be available to your template at this point include "errortemplates/dev.php"; } else { include "errortemplates/prod.php"; } } 

Ci sono informazioni più specifiche sui "callback" di PHP qui . Per usare un metodo statico, il callback è qualcosa di simile

 <?php set_exception_handler(arrays('MyClass','staticMethod')); ?> 

Per utilizzare un metodo da un object istanziato, è:

 <?php set_exception_handler(arrays($myObject, 'objectMethod')); ?> 

E per usare una function globale, è solo:

 <?php set_exception_handler('my_global_function'); ?> 

Dal modo in cui suona, usenetworking set_exception_handler. Ciò garantirà che tutte le eccezioni siano gestite nello stesso modo. Ci sono luoghi in cui utilizzare i blocchi try / catch nella tua applicazione, diciamo se vuoi verificare una singola exception che non debba necessariamente essere catturata nello stesso modo.

Per quanto riguarda set_exception_handler, non sono sicuro che tu possa impostare la function come metodo di un object a less che non sia un metodo statico. Sembra che sia così. Ci sono ulteriori informazioni su http://us2.php.net/set_exception_handler