Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Comment simplifier le traitement des erreurs ?

On dit souvent au débutant : "lorsque tu fais un mysql_query, il faut tester le résultat de la requête avant de poursuivre !" ...

Parfois on propose des solutions dont la plus courante est :

<?php
$result_set = @mysql_query( $sql )
or die( 'erreur dans la requête : ' . $sql . '<br />' . mysql_error() );
?>

Pour ma part, je fais (je faisais) :

<?php
$result_set = @mysql_query( $sql )
or trigger_error( 'erreur dans la requête : ' . $sql . '<br />' . mysql_error() );
?>

Seulement, actuellement je me suis lancé sur des "proof of concept" (hein Ymage !) dans lequel je menais une réflexion sur l'exploitation des erreurs en tant que processus "normal" de traitement de l'information (je rentre pas dans les détails, j'en parlerai peut-être un jour).

Et c'est là que je me suis dit : "On est trop con, la solution est si simple !"

Désormais, j'utilise mes fonctions de la manière suivante (c'est du sqlite, mais le résultat est pareil) :
<?php
$result_set = sqlite_query( $sql );
?>

Sans "@" ni "or quelquechose".

Par contre, j'ai le code suivant au début de tous mes scripts (merci l'auto_prepend) :
<?php
function error_handler( $errno, $errstr, $errfile, $errline ) {
   static $error_functions = array( 'sqlite_query' => 'error_sqlite_query' );
   if( 0 === error_reporting() ) return;
   $trace = debug_backtrace();
   $function = $trace[1]['function'];
   if( isset( $error_functions[ $function ] ) ) {
     $error_functions[ $function ]($errstr, $errfile, $errline, $trace[1]['args'] );
   } else {
      echo '<p>Erreur dans le fichier <strong>', $errfile, '</strong>';
      echo ' à la ligne <strong>', $errline, '</strong></p>';
      echo '<pre class="error">', $errstr,'</pre>';
   }
   exit;
}

function error_sqlite_query( $errstr, $errfile, $errline, $args ) {
   echo '<p>Erreur SQL dans le script <strong>', $errfile, '</strong>';
   echo ' à la ligne <strong>', $errline, '</strong></p>';
   echo '<p class="error">';
   echo sqlite_error_string( sqlite_last_error( $args[0] ) );
   echo '</p>';
   echo '<p>Requête :<br /><pre class="sql">', $args[1], '</pre></p>';
}

set_error_handler( 'error_handler');
?>

Attention, cette technique n'est valable qu'a partir de la version 4.3.0

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin