Exceptions dans PHP-Try / Catch ou set exception handler?

je suis en train de développer un code de bas de page dans mon système qui utilise plusieurs classes enfant de la classe PHP exception. Essentiellement, j'ai les exceptions brisés pour quelques catégories. Ce que je suis désireux de faire deux choses.

  1. j'ai besoin que toutes les exceptions qui sont lancées dans l'application soient traitées en un seul endroit.
  2. j'ai besoin de pouvoir me connecter et ensuite gérer/générer la vue pour que l'utilisateur puisse recevoir des commentaires sur les applications. erreur.

Ce qui Je me demande si je devrais avoir une sorte d'essai/capture encapsulant l'application? Je n'aime pas du tout cette idée, ça ressemble à une implémentation très merdique. Je n'aime pas non plus l'idée de set_exception_handler à moins de pouvoir configurer la fonction pour qu'elle soit une méthode d'un objet. La raison pour cela est que si je désigne une fonction pour gérer les exceptions, ce sera la première fonction de l'application. Tout le reste est une méthode d'un objet.

J'espère avoir fourni assez détails sur le scénario. J'essaie de garder ça propre et de suivre les meilleures pratiques. Ce code va OSS donc je n'ai pas envie d'écrire 10 fois :)

17
demandé sur Charles 2009-02-17 17:27:55

3 réponses

  1. exécutez vos requêtes web à travers un script du contrôleur avant
  2. appel set_exception_handler début de l'exécution (n'oubliez pas de compte pour error_reporting()). set_exception_handler prend comme paramètre ce que php appelle un "rappel". Vous pouvez passer d'une méthode de l'objet comme ceci:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  3. enveloppez votre code d'expédition avec try/catch pour attraper n'importe quel code qui NE lancer des exceptions. La capture de la partie de votre code va attraper toutes les exceptions de vos propres codes, plus les erreurs php qui n'ont pas généré d'exception nativement (par exemple fopen ou quelque chose), grâce à votre set_exception_handler l'appel ci-dessus. Le manuel php stipule:

    les types d'erreurs suivants ne peuvent pas être traitées avec une fonction définie par l'utilisateur: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT soulevé dans le dossier où set_error_handler() est appelé.

  4. consignez les erreurs au besoin.

  5. créer un modèle de page d'erreur (la "vue") qui fonctionne sur un objet D'Exception (le "Modèle") et pretty imprime la trace de pile entière pour vous, en développement. Créer un modèle différent qui va à la production. Branche sur votre environnement, par exemple:

    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";
        }
    }
    
23
répondu Crescent Fresh 2017-05-23 10:27:51

il y a des informations plus spécifiques sur les "callbacks" de PHP ici. Pour utiliser une méthode statique, le callback est quelque chose comme

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

Pour utiliser une méthode d'un objet instancié, c'est:

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

Et d'utiliser une fonction globale, c'est juste:

<?php
set_exception_handler('my_global_function');
?>
11
répondu James Socol 2009-02-17 15:10:17

de la façon dont ça sonne, vous utiliserez set_exception_handler. Cela garantira que toutes les exceptions sont traitées de la même manière. Il y a des endroits pour utiliser les blocs try/catch dans votre application, par exemple si vous voulez vérifier une seule exception qui n'a pas nécessairement besoin d'être attrapé de la même manière.

en ce qui concerne la définition de set_exception_handler, Je ne suis pas sûr que vous puissiez définir la fonction comme étant une méthode d'un objet à moins qu'il ne s'agisse d'une méthode statique. Il semble que c'est le cas. Il y a plus d'information à http://us2.php.net/set_exception_handler

3
répondu scheibk 2009-02-17 14:40:48