2010-07-30 12 views
2

Je veux faire quelque chose d'un peu bête. Dans ma méthode Dispose() pour un objet, je veux imprimer une trace de débogage pour l'objet, en me disant tous les événements qui se sont produits pendant qu'il était vivant.Déterminez si le code est appelé à partir d'un gestionnaire d'exceptions (using instruction)?

Mais comme cela prend du temps et de l'argent, je veux seulement faire cela si Dispose() est appelée parce qu'une exception a été levée.

Je voudrais faire

if (exceptionIsCurrentlyRaised) PrintDebugStuff(); 

Est-ce que .NET ont une telle propriété exceptionIsCurrentlyRaised que je peux interroger?

+0

Je doute que vous puissiez garder arbitrairement la trace de tous les "événements" qui arrivent à un objet. Si vous voulez garder une trace, il suffit de mettre la journalisation dans l'objet qui enregistre ce dont vous avez besoin chaque fois que des méthodes sont appelées. –

+0

Je fais ma propre consignation des événements qui m'intéressent, mais ce n'est pas la question que je pose. –

+1

duplicata possible de [Détermine si exécution en bloc en raison de l'exception étant levée] (http://stackoverflow.com/questions/3301507/determine-if-executing-in-finally-block-due-to-exception-being- jeté) –

Répondre

0

Je ne sais pas si quelque chose comme ça existe comme je ne l'ai jamais vu. Mais il semble que vous pourriez simplement créer une interface qui a une seule propriété booléenne. Ensuite, lorsque vous êtes dans l'instruction catch, mais avant d'appeler la méthode dispose, il suffit de définir le drapeau.

Je suppose que ça ne peut pas être aussi simple qu'une solution, mais j'ai pensé que j'aurais des idées à faire.

EDIT: Ok j'ai aussi trouvé cet article qui SO a un problème similaire: Determine if executing in finally block due to exception being thrown

0

question intéressante, mais je doute que cela soit possible - au moins pas sans piratage majeur en utilisant le débogage ou les API de profilage.

Même si vous étiez en mesure d'appeler une API de débogage qui pourrait vous donner accès à l'exception actuelle dans un bloc catch Je ne pense pas que vous pourriez obtenir l'exception dans un bloc finally (qui est l'endroit où votre méthode Dispose serait réalisé). D'ici là, l'exception peut avoir été traitée, donc, en ce qui concerne l'exécution, il n'y a pas d'exception.

La seule façon que je peux voir si cela est de s'enregistrer pour être informé de toutes exceptions depuis que votre objet a été construit et de là essayer de comprendre si l'exception a été interceptée ou non. Cette réponse peut être utile: .NET - First chance exception listener for intensive debugging?

+1

Si l'exception était manipulé et non rethrown, il n'y aurait en effet pas d'exception pendant que le bloc 'finally' fonctionnait. D'un autre côté, un scénario commun est que les blocs finally s'exécutent lorsqu'une exception est lancée sur une étendue externe. Si un bloc finally essaie de faire quelque chose comme une annulation de transaction et qu'il échoue, il doit lancer une exception d'échec de restauration avec l'exception en attente comme InnerException. Malheureusement, il n'y a pas de moyen propre de le faire. – supercat

0

En fait, cela est quelque chose comme la fonctionnalité de Visual Studio « IntelliTrace » 2010, qui peut enregistrer ce qui est arrivé au cours d'une session de débogage lorsque vous étiez pas à un point d'arrêt.

+0

Une bonne obvservation. Est-il possible d'utiliser intellitrace sans utiliser VS? –

+0

Je ne sais vraiment pas. Je ne l'ai pas encore compris. –