web-dev-qa-db-fra.com

php: try-catch ne capture pas toutes les exceptions

J'essaie de faire ce qui suit:

try {
    // just an example
    $time      = 'wrong datatype';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception $e) {
    return false;
}
// database activity here

En bref: j'initialise certaines variables à mettre dans la base de données. Si l'initialisation échoue pour une raison quelconque - par exemple parce que $ time n'est pas le format attendu - je veux que la méthode retourne false et ne saisisse pas de données erronées dans la base de données.

Cependant, des erreurs comme celle-ci ne sont pas détectées par l'instruction "catch", mais par le gestionnaire d'erreurs global. Et puis le script continue.

Y a-t-il un moyen de contourner ceci? Je pensais simplement qu'il serait plus propre de le faire comme ceci au lieu de vérifier manuellement chaque variable, ce qui semble inefficace étant donné que dans 99% des cas, rien de mauvais ne se produit.

34
Marcos

Solution n ° 1

Utilisez ErrorException pour transformer les erreurs en exceptions pour 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 n ° 2

try {
    // just an example
    $time      = 'wrong datatype';
    if (false === $timestamp = date("Y-m-d H:i:s", $time)) {
        throw new Exception('date error');
    }
} catch (Exception $e) {
    return false;
}
39
Federkun
try {
  // call a success/error/progress handler
} catch (\Throwable $e) { // For PHP 7
  // handle $e
} catch (\Exception $e) { // For PHP 5
  // handle $e
}
37
Nabi K.A.Z.

Le plus court que j'ai trouvé:

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

Transforme toutes les erreurs en instance de capture ErrorException

7
Luca C.