web-dev-qa-db-fra.com

PHP Gestion des erreurs: die () Vs trigger_error () Vs throw Exception

En ce qui concerne la gestion des erreurs dans PHP - Pour autant que je sache, il existe 3 styles:

  1. die() ou exit() style:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    
  2. Style throw Exception:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
    
  3. trigger_error() style:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }
    

Maintenant, dans le manuel PHP les trois méthodes sont utilisées.

  • Ce que je veux savoir, c'est quel style dois-je préférer et pourquoi?

  • Ces 3 remplacements sont-ils interchangeables et peuvent-ils donc être utilisés de manière interchangeable?

Légèrement OT: Est-ce juste moi ou tout le monde pense que PHP les options de gestion des erreurs sont juste trop nombreuses dans la mesure où cela déroute les développeurs php?

114
CuriousMind

Le premier ne doit jamais être utilisé dans le code de production, car il transporte des informations non pertinentes pour les utilisateurs finaux (un utilisateur ne peut rien faire pour "Impossible de se connecter à la base de données" ).

Vous jetez des exceptions si vous savez qu'à un certain point de code critique, votre application peut échouer et que vous voulez que votre code récupère sur plusieurs niveaux d'appel.

trigger_error() vous permet de rapporter les erreurs avec précision (en utilisant différents niveaux de messages d'erreur) et vous pouvez masquer ces erreurs aux utilisateurs finaux (en utilisant set_error_handler() ) mais toujours les afficher pendant le test.

trigger_error() peut également produire des messages non fatals importants pendant le développement qui peuvent être supprimés dans le code de production à l'aide d'un gestionnaire d'erreurs personnalisé. Vous pouvez également produire des erreurs fatales (E_USER_ERROR) Mais celles-ci ne sont pas récupérables. Si vous en déclenchez un, l'exécution du programme s'arrête à ce stade. C'est pourquoi, pour les erreurs fatales, des exceptions doivent être utilisées. De cette façon, vous aurez plus de contrôle sur le flux de votre programme:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

Ici, si gather_data() tout simplement croassée (en utilisant E_USER_ERROR Ou die()) il y a une chance, les précédentes instructions INSERT se seraient introduites dans votre base de données, même si ce n'est pas souhaité et vous n'auriez aucun contrôle sur ce qui va se passer ensuite.

85
Linus Kleen

J'utilise généralement la première méthode pour le débogage simple dans le code de développement. Il n'est pas recommandé pour la production. La meilleure façon est de lever une exception, que vous pouvez intercepter dans d'autres parties du programme et gérer les erreurs.

Les trois styles ne sont pas des remplacements directs les uns des autres. La première n'est pas du tout une erreur, mais juste un moyen d'arrêter le script et de sortir des informations de débogage pour que vous puissiez les analyser manuellement. Le second n'est pas une erreur en soi, mais sera converti en erreur si vous ne l'attrapez pas. Le dernier déclenche une véritable erreur dans le moteur PHP qui sera géré en fonction de la configuration de votre environnement PHP (dans certains cas montré à l'utilisateur) , dans d'autres cas, juste connecté à un fichier ou pas enregistré du tout).

9
Emil Vikström