en réponse à la réponse acceptée, je suis venu avec un (peut-être) meilleure façon de gérer les exceptions à l'intérieur __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 est un gestionnaire d'exception définie, ce qui est le cas pour la plupart des cadres . Comme avec la méthode trigger_error
, cela va défier le but de try..catch, mais il est encore mieux que la sortie de dumping avec echo
. En outre, de nombreux cadres transforment les erreurs en exceptions, donc trigger_error
ne fonctionnera pas de toute façon. Comme bonus supplémentaire, vous obtiendrez une pile-trace complète comme avec les exceptions normales et le comportement normal de dev-production de votre cadre de choix.
Fonctionne très bien à Laravel, et je suis sûr que cela fonctionnera à peu près tous les frameworks PHP modernes là-bas.
Screenshot pertinents:
Note: dans cet exemple, output()
est appelé par une méthode __toString()
.
heh, merci. mais trigger_error() ne peut pas remplacer try/catch simplement parce que c'est global et try/catch est concret. – zerkms
@zerkms - C'est vrai, ce n'est pas un remplacement. Peut-être que si suffisamment de gens expriment leurs opinions, ils réécriront le moteur Zend. :) –
aussi, de nombreux frameworks attrapent les erreurs et les relancent comme des exceptions - ce qui ramènerait exactement le même problème. –