2009-11-27 3 views

Répondre

8

Vous pouvez joindre le contexte à votre exception manuellement. Je n'ai jamais essayé, mais il serait intéressant de créer une exception personnalisée qui dans le constructeur appelle et enregistre get_defined_vars() pour récupération ultérieure.
Ce sera une exception lourde :-)

preuve de concept:

class MyException extends Exception() { 
    protected $throwState; 

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

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

encore mieux:

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, mais get_defined_vars ici n'inclura pas les variables locales du code qui construit l'exception, non? –

+0

Pas si elles sont invisibles à l'exception "Exception" en effet. Pour surmonter cela, je recommande d'ajouter une méthode 'setState (array $ state)' et de fournir 'get_defined_vars' lorsque vous lancez l'exception. J'ai changé le code en conséquence. –

+0

La bonne façon de le faire est comme Andrew mentionné ci-dessous. * Note: * Les exceptions ne devraient pas être modifiables! Une fois que vous l'avez lancé, cela ne devrait pas changer ... donc pourquoi 'setState()' est une mauvaise idée;) ** PS: ** voici comment c'est fait [dans Symfony] (https://github.com/ ladybirdweb/agorainvoicing/blob/maître/vendeur/symfony/debug/Exception/ContextErrorException.php) (avertissement: je l'ai écrit) – Christian

-2

La fonction équivalente pour le traitement eceptions est:
set_exception_handler()

Une autre fonction très utile est:
debug_backtrace()

+0

Oui, mais ce n'est pas ma question. J'ai besoin d'obtenir le contexte d'une exception que j'ai déjà saisie. Merci pour votre temps si –

+1

Par défaut les exceptions PHP ne contiennent pas cette information, et au moment où vous avez attrapé l'exception, l'information sur les vars locaux etc. que vous voulez a déjà été détruite parce que la trame de la pile d'origine a déjà été sautée . Si vous n'avez pas le contrôle du contexte dans lequel l'exception a été lancée, vous pouvez ajouter le contexte là-bas, alors vous n'avez aucun moyen d'obtenir ce contexte. –

+0

Oui, mais cela ne répond pas à la question posée. – Octavian

1

exceptions en PHP:

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

Méthodes de la classe de base Exception:

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 

Alors, voici ce que vous devez travailler avec si vous avez pris une exception de base. Si vous n'avez pas de contrôle sur le code qui génère l'exception, il n'y a pas grand-chose à faire pour obtenir plus de contexte car le contexte dans lequel il a été jeté est parti au moment où vous l'attrapez. Si vous générez l'exception vous-même, vous pouvez attacher le contexte à l'exception avant qu'elle ne soit lancée.

2

Ne pourriez-vous faire aussi:

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; 
    } 
} 

Cela éviterait la nécessité d'instancier l'exception et le jeter.

Questions connexes