Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/12/2008, 10:49
Avatar de ArrauKano
ArrauKano
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 6 meses
Puntos: 4
Problema con Exception disparado dentro de __toString()

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 original
  1. abstract class Rox_Wigdet
  2. {
  3.  
  4.     public function getContent()
  5.     {
  6.         return 'Contenido';
  7.     }
  8.  
  9.     final public function __toString()
  10.     {
  11.         try {
  12.             return (string) $this->getContent();
  13.         } catch ( Rox_Widget_Exception $e ) {
  14.             trigger_error($e->getMessage(), E_USER_WARNING);
  15.             }
  16.         return '';
  17.     }
  18. }

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
  1. <?php
  2.  
  3. class A {
  4.  
  5.     public function output()
  6.     {
  7.         return ' algo A ';
  8.     }
  9.  
  10.     public function __toString()
  11.     {
  12.         try {
  13.             $out = $this->output();
  14.         } catch ( Exception $e ) {
  15.             trigger_error($e->getMessage(), E_USER_WARNING);
  16.             $out = $e->getMessage ();
  17.         }
  18.        return $out;
  19.     }
  20. }
  21.  
  22. class B extends A {
  23.     public function output()
  24.     {
  25.         return ' algo B ';
  26.     }
  27. }
  28.  
  29. class C extends B {
  30.     public function output()
  31.     {
  32.         throw new Exception('boooooooo!');
  33.         return ' algo C ';
  34.     }
  35. }
  36.  
  37.  
  38. /** Prueba: */
  39.  
  40. $stack = array(
  41.     new A(),
  42.     new B(),
  43.     new C()
  44. );
  45.  
  46. echo implode( $stack );
__________________
Blog | Tecnosquad

Última edición por ArrauKano; 08/12/2008 a las 10:54