Si vous utilisez un custom error handler en PHP, vous pouvez voir le contexte d'une erreur (la valeur de toutes les variables à l'endroit où elle s'est produite). Y a-t-il un moyen de faire cela pour des exceptions? Je veux dire obtenir le contexte, ne pas définir un gestionnaire d'exception.Obtenir le contexte d'exception dans PHP
Répondre
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());
La fonction équivalente pour le traitement eceptions est:
set_exception_handler()
Une autre fonction très utile est:
debug_backtrace()
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 –
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. –
Oui, mais cela ne répond pas à la question posée. – Octavian
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.
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.
- 1. obtenir le contexte dans le convertisseur?
- 2. Obtenir le contexte d'appel dans un service
- 3. événement jquery - obtenir le contexte
- 4. Obtenir le contexte à partir de UIImageView
- 5. PHP comment dire le type de vocabulaire dans le contexte
- 6. Comment obtenir le contexte graphique d'un UIView?
- 7. Comment obtenir le contexte d'un sélecteur jQuery
- 8. Comment obtenir le contexte django automatiquement dans les filtres Jinja2?
- 9. Problème dans le contexte Listener
- 10. .NET - n'existe pas dans le contexte actuel
- 11. Obtenir la liste d'un certain contexte avec le propriétaire
- 12. Comment obtenir le nom de contexte actuel de rspec?
- 13. comment obtenir texte sélectionné entourant le contexte dans javascript dans le paragraphe différent?
- 14. Obtenir l'ID de l'utilisateur appelant dans le script PHP setuid
- 15. exécuter le bloc fonctionnel dans le contexte de l'espace de noms global dans PHP
- 16. erreur dans C++, dans le contexte
- 17. comment obtenir le texte sélectionné, mais puis-je obtenir le contexte environnant en javascript?
- 18. Obtenir contexte SSL pour HttpsURLConnection de X509Certificate
- 19. Comment obtenir la taille d'un contexte Iphone
- 20. Comment obtenir un contexte de périphérique d'imprimante?
- 21. Comment obtenir une mise en page dans un contexte donné?
- 22. Obtenir le contexte de la chaîne de recherche dans le texte en C#
- 23. Quels haricots vont dans le contexte d'application contre le contexte Web au printemps?
- 24. Comment configurer Contexte en utilisant PHP
- 25. obtenir Erreur fatale: Utiliser $ quand pas dans le contexte de l'objet dans Stemmer.php en ligne 317
- 26. Python - Enregistrer le contexte
- 27. Contrôle non disponible dans le contexte actuel
- 28. C# n'existe pas dans le contexte actuel
- 29. Thread Worker Background dans le contexte WebService
- 30. Comment rediriger dans Django avec le contexte?
Hmm, mais get_defined_vars ici n'inclura pas les variables locales du code qui construit l'exception, non? –
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. –
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