Bueno, tengo clarísimo que dentro de un método __toString no pueden dispararse excepciones, pero...
Tengo un stack de objetos que pretendo escapar como string, haciendo simplemente un implode(), de tal modo que el casting llame automáticamente a la salida en forma de texto de cada objeto y los junte en una sola cadena.
Todos los objetos del stack son hijos de "Widget", y mi clase Widget tiene un método __toString() que llama a otro método getContent().
Código php:
Ver originalabstract class Rox_Wigdet
{
public function getContent()
{
return 'Contenido';
}
final public function __toString()
{
try {
return (string) $this->getContent();
} catch ( Rox_Widget_Exception $e ) {
}
return '';
}
}
La idea es que cada widget pueda definir su contenido y que siempre se dibujen de igual manera.
Para prevenir que el contenido del objeto dispare cualquier excepcion, pensé en rodear todo el __toString con un bloque try...catch.
Pensé que estaba todo bien, pero hoy al modificar un widget, tuve un problema que disparó una excepcion, y descubrí que por algún motivo, la excepcion simplemente se saltó el bloque
.
Acá hice un ejemplo reproducible:
Código php:
Ver original<?php
class A {
public function output()
{
return ' algo A ';
}
public function __toString()
{
try {
$out = $this->output();
} catch ( Exception $e ) {
$out = $e->getMessage ();
}
return $out;
}
}
class B extends A {
public function output()
{
return ' algo B ';
}
}
class C extends B {
public function output()
{
throw new Exception('boooooooo!');
return ' algo C ';
}
}
/** Prueba: */
new A(),
new B(),
new C()
);