87 votes

Php: try-catch ne capture pas toutes les exceptions

Je suis en train d'essayer de faire ce qui suit :

try {
    // juste un exemple
    $time      = 'mauvais type de données';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception $e) {
    return false;
}
// activité de la base de données ici

En bref : j'initialise certaines variables à insérer dans la base de données. Si l'initialisation échoue pour quelque raison que ce soit - par exemple parce que $time n'est pas le format attendu - je veux que la méthode retourne faux et n'insère pas de données incorrectes dans la base de données.

Cependant, les erreurs de ce genre ne sont pas capturées par l'instruction 'catch', mais par le gestionnaire d'erreurs global. Et ensuite le script continue.

Y a-t-il un moyen de contourner cela ? Je pensais simplement que ce serait plus propre de le faire de cette manière plutôt que de vérifier manuellement chaque variable, ce qui semble inefficace étant donné que dans 99 % des cas, rien de grave ne se produit.

138voto

Nabi K.A.Z. Points 311
Essayer {
  // appeler un gestionnaire de réussite/erreur/progrès
} attraper (\Throwable $e) { // Pour PHP 7
  // gérer $e
} attraper (\Exception $e) { // Pour PHP 5
  // gérer $e
}

55voto

Federkun Points 12908

Solution #1

Utilisez ErrorException pour convertir les erreurs en exceptions à gérer :

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

Solution #2

try {
    // juste un exemple
    $time      = 'mauvais type de données';
    if (false === $timestamp = date("Y-m-d H:i:s", $time)) {
        throw new Exception('erreur de date');
    }
} catch (Exception $e) {
    return false;
}

12voto

Luke Points 82

La version la plus courte que j'ai trouvée :

set_error_handler(function($errno, $errstr, $errfile, $errline ){
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

Transforme toutes les erreurs en instances de ErrorException qui peuvent être rattrapées

10voto

Amal Magdy Points 19

Il est possible d'utiliser catch(Throwable $e) pour attraper toutes les exceptions et les erreurs comme ceci :

catch ( Throwable $e){
    $msg = $e->getMessage();
}

7voto

mikiqex Points 126

Il est également possible de définir plusieurs types pour le paramètre $e dans catch :

try {
    // juste un exemple
    $time      = 'mauvais type de données';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception|TypeError $e) {
    return false;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X