2009-11-27 16 views

Respuesta

8

Puede adjuntar el contexto de su excepción manualmente. Nunca lo he intentado, pero sería interesante crear una excepción personalizada que en el constructor llame y guarde get_defined_vars() para una recuperación posterior.
Esta será una pesada excepción :-)

prueba de concepto:

class MyException extends Exception() { 
    protected $throwState; 

    function __construct() { 
     $this->throwState = get_defined_vars(); 
     parent::__construct(); 
    } 

    function getState() { 
     return $this->throwState; 
    } 
} 

aún mejor:

class MyException extends Exception implements IStatefullException() { 
    protected $throwState; 

    function __construct() { 
     $this->throwState = get_defined_vars(); 
     parent::__construct(); 
    } 

    function getState() { 
     return $this->throwState; 
    } 

    function setState($state) { 
     $this->throwState = $state; 
     return $this; 
    } 
} 

interface IStatefullException { function getState(); 
     function setState(array $state); } 


$exception = new MyException(); 
throw $exception->setState(get_defined_vars()); 
+1

Hmm, pero get_defined_vars aquí no incluirá las variables locales del código que construye la excepción, ¿verdad? –

+0

No si son invisibles para la 'Excepción' de hecho. Para superar esto, recomendaría agregar un método 'setState (array $ state)' y suministrar 'get_defined_vars' cuando arroje la excepción. Cambié el código en consecuencia. –

+0

La forma correcta de hacerlo es como lo menciona Andrew a continuación. * Nota: * ¡Las excepciones no deben ser cambiables! Una vez que lo arrojes, no debería cambiar ... de ahí por qué 'setState()' es una mala idea;) ** PD: ** así es como se hace [en Symfony] (https://github.com/ ladybirdweb/agorainvoicing/blob/master/vendor/symfony/debug/Exception/ContextErrorException.php) (descargo de responsabilidad: lo escribí) – Christian

-2

La función equivalente para el manejo de eceptions es:
set_exception_handler()

Otra función muy útil es:
debug_backtrace()

+0

Sí, pero esa no es mi pregunta. Necesito obtener el contexto de una excepción que ya he capturado. Gracias por su tiempo, –

+1

Por defecto, las excepciones de PHP no contienen esa información, y para cuando atrapó la excepción, la información sobre los vars locales etc. que desea ya se ha destruido porque el marco de pila de origen ya se ha reventado . Si no tiene control del contexto donde se lanzó la excepción para que pueda agregar el contexto allí, entonces no hay forma de que obtenga ese contexto. –

+0

Sí, pero esto no responde la pregunta. – Octavian

1

excepciones en PHP:

http://www.php.net/manual/en/language.exceptions.extending.php

Los métodos de la clase básica Excepción:

final public function getMessage();  // message of exception 
final public function getCode();   // code of exception 
final public function getFile();   // source filename 
final public function getLine();   // source line 
final public function getTrace();   // an array of the backtrace() 
final public function getPrevious();  // previous exception 
final public function getTraceAsString(); // formatted string of trace 

lo tanto, esto es lo que tiene que trabajar si usted cogió una excepción básica. Si no tiene control sobre el código que genera la excepción, entonces no hay mucho que hacer para obtener más contexto ya que el contexto en el que se lanzó ya no está en el momento en que lo detecta. Si está generando la excepción usted mismo, puede adjuntar el contexto a la excepción antes de lanzarla.

2

No se pudo también hacer:

class ContextException extends Exception { 

    public $context; 

    public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) { 
     parent::__construct($message, $code, $previous); 
     $this->context = $context; 
    } 

    public function getContext() { 
     return $this->context; 
    } 
} 

que evitaría la necesidad de crear una instancia de la excepción y luego tirarlo.

Cuestiones relacionadas