En réponse à la réponse acceptée, j'ai trouvé une (peut-être) meilleure façon de gérer les exceptions à l'intérieur de l'entreprise __toString()
:
public function __toString()
{
try {
// ... do some stuff
// and try to return a string
$string = $this->doSomeStuff();
if (!is_string($string)) {
// we must throw an exception manually here because if $value
// is not a string, PHP will trigger an error right after the
// return statement, thus escaping our try/catch.
throw new \LogicException(__CLASS__ . "__toString() must return a string");
}
return $string;
} catch (\Exception $exception) {
$previousHandler = set_exception_handler(function (){
});
restore_error_handler();
call_user_func($previousHandler, $exception);
die;
}
}
Cela suppose qu'il existe un gestionnaire d'exception défini, ce qui est le cas pour la plupart des frameworks. Comme pour les trigger_error
méthode, en faisant cela, on défie le but de try..catch mais c'est quand même bien mieux que de vider la sortie avec echo
. De plus, de nombreux cadres de travail transforment les erreurs en exceptions, donc trigger_error
ne fonctionnera pas de toute façon.
En prime, vous obtiendrez un suivi complet de la pile, ainsi que les exceptions normales et le comportement normal en production de votre framework de choix.
Il fonctionne très bien avec Laravel, et je suis sûr qu'il fonctionnera avec la plupart des frameworks PHP modernes.
Capture d'écran pertinente :
note dans cet exemple, output()
est appelé par un __toString()
méthode.
![__toString() exception caught by Laravel exception handler]()