101 votes

Comment attraper une "erreur fatale rattrapable" sur les indications de type de PHP ?

J'essaie d'implémenter le Type Hinting de PHP5 dans une de mes classes,

class ClassA {
    public function method_a (ClassB $b)
    {}
}

class ClassB {}
class ClassWrong{}

Utilisation correcte :

$a = new ClassA;
$a->method_a(new ClassB);

produisant une erreur :

$a = new ClassA;
$a->method_a(new ClassWrong);

Erreur fatale rattrapable : Argument 1 passé à ClassA::method_a() doit être une instance de ClassB, instance de ClassWrong donnée...

Puis-je savoir s'il est possible d'attraper cette erreur (puisqu'il est écrit "catchable") ? et si oui, comment ?

Merci.

117voto

VolkerK Points 54118

http://docs.php.net/errorfunc.constants dit :

E_RECOVERABLE_ERROR ( entier )
Erreur fatale rattrapable. Elle indique qu'une erreur probablement dangereuse s'est produite, mais n'a pas laissé le moteur dans un état instable. Si l'erreur n'est pas prise en charge par un handle défini par l'utilisateur (voir aussi set_error_handler() ), l'application s'arrête car il s'agissait d'un E_ERROR.

voir aussi : http://derickrethans.nl/erecoverableerror.html

par exemple

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

$a = new ClassA;
$a->method_a(new ClassWrong);
echo 'done.';

imprime

'catched' catchable fatal error
done.

edit : Mais vous pouvez "en faire" une exception que vous pouvez gérer avec un bloc try-catch.

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    // return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

try{
  $a = new ClassA;
  $a->method_a(new ClassWrong);
}
catch(Exception $ex) {
  echo "catched\n";
}
echo 'done.';

voir : http://docs.php.net/ErrorException

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