Si utiliza un custom error handler en PHP, puede ver el contexto de un error (el valor de todas las variables en el lugar donde se produjo). ¿Hay alguna forma de hacer esto para excepciones? Me refiero a obtener el contexto, no establecer un controlador de excepción.Obtener contexto de excepción en PHP
Respuesta
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());
La función equivalente para el manejo de eceptions es:
set_exception_handler()
Otra función muy útil es:
debug_backtrace()
Sí, pero esa no es mi pregunta. Necesito obtener el contexto de una excepción que ya he capturado. Gracias por su tiempo, –
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. –
Sí, pero esto no responde la pregunta. – Octavian
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.
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.
- 1. JAXB Excepción: Clase desconocida en este contexto
- 2. Obtener contexto en un servicio
- 3. hashmap en contexto de aplicación php
- 4. obtener contexto de usuario actual
- 5. PHP "Excepción no encontrada"
- 6. java.lang.ExceptionInInitializerError Excepción al crear contexto de aplicación en Spring
- 7. obtener el contexto en onCreate en SQLiteOpenHelper
- 8. ¿Cómo obtener el contexto actual?
- 9. Obtener lienzo desde el contexto
- 10. PHP excepción personalizada manejo
- 11. Proyecto de biblioteca Android: ¿cómo obtener contexto?
- 12. Cómo lanzar una excepción matriz en PHP
- 13. El término "pajar" en el contexto de PHP
- 14. ¿Cómo obtener el contexto desde cualquier lugar?
- 15. Obtener propietario del menú de contexto en el código
- 16. Obtener el contexto de Android en un adaptador
- 17. Obtener una excepción con AutoMapper
- 18. ¿Qué significa hilo seguro en un contexto PHP?
- 19. Cómo obtener un objeto fuente de excepción
- 20. Contexto de acceso en ContentProvider
- 21. Node.js Patrón de programación para obtener el contexto de ejecución
- 22. ¿Cómo obtener el nombre de contexto actual de rspec?
- 23. ¿Cómo obtener URI de solicitud sin ruta de contexto?
- 24. obtener hora UTC en PHP
- 25. Obtener max_execution_time en script PHP
- 26. Permisos de Unix, leer y ejecutar (contexto PHP)
- 27. Cómo implementar el encadenamiento de excepción en PHP
- 28. ¿Hay una forma estática de lanzar excepción en php
- 29. Una forma de obtener información no estática del contexto estático
- 30. Cómo obtener objetos después de combinar el contexto CoreData
Hmm, pero get_defined_vars aquí no incluirá las variables locales del código que construye la excepción, ¿verdad? –
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. –
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