en respuesta a la respuesta aceptada, se me ocurrió una (tal vez) una mejor manera de manejar excepciones dentro __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;
}
}
esto supone que es un manejador de excepciones definido, que es el caso para la mayoría de los marcos . Al igual que con el método trigger_error
, haciendo esto desafiará el propósito de try..catch, pero aún así es mucho mejor que la salida de dumping con echo
. Además, muchos frameworks transforman errores en excepciones, por lo que trigger_error
no funcionará de todos modos.
Como una ventaja adicional, obtendrás un stack-trace completo como con las excepciones normales y el comportamiento normal de dev-production del framework de tu elección.
Funciona muy bien en Laravel, y estoy bastante seguro de que funcionará en casi todos los frameworks PHP modernos.
pantalla relevante:
nota: en este ejemplo, output()
es llamado por un método __toString()
.

heh, gracias. pero trigger_error() no puede reemplazar try/catch solo porque es global y try/catch es concreto. – zerkms
@zerkms - Es cierto, no es un reemplazo. Quizás si suficientes personas expresan sus opiniones, reescribirán el Zend Engine. :) –
también, muchos frameworks detectan errores y los vuelven a lanzar como excepciones, lo que devolvería exactamente el mismo problema. –