2017-09-15 1 views
1

Parfois, lorsqu'une exception se produit sur une méthode de classe .NET, cette méthode est elle-même en interne appelant un tas d'autres méthodes, mais l'erreur se produit dans l'un des ceux-ci. Cela donne une trace de pile gonflée et désordonnée avec des choses plus "insignifiantes" que nécessaire. Existe-t-il un moyen d'obtenir une trace de pile qui s'arrête à la méthode publique .NET qui a provoqué l'erreur par rapport à l'affichage de tous les composants internes des méthodes .NET?Peut-on générer une trace de pile .NET qui exclut les méthodes internes?

Un exemple serait ExecuteNonQuery() de ADO.NET. En interne, cela appelle 5-6 fonctions et l'exception ne peut pas arriver avant cette 6e fonction imbriquée et donc la trace de la pile montre tous ces internes dont nous ne pouvons rien faire. Ce serait gentil et plus propre s'il s'arrêtait à ExecuteNonQuery() puisque c'est la méthode .NET publique.

+1

Y a-t-il des raisons pratiques? Vous pouvez attraper et rejeter, mais pourquoi? – Sinatr

+4

Etes-vous sûr que les noms de méthodes internes sont inutiles? Par exemple. si 'ExecuteNonQuery' lance une' NullReferenceException', où commencez-vous à chercher? Par contre, si les noms de méthodes internes incluent le mot 'Paramètre', cela ne vous aide-t-il pas à zoomer plus rapidement sur l'endroit où vous devriez chercher? –

+0

Vous pouvez créer une classe d'exception personnalisée et filtrer les choses que vous ne voulez pas dans la trace de la pile. – PaulF

Répondre

4

La réponse est « non », vous ne pouvez pas changer la façon .NET génère des traces de pile. Quand une trace de pile est générée, elle affiche chaque site d'appel. Toutefois, si vous souhaitez avoir des comportements personnalisés, vous pouvez écrire du code personnalisé pour modifier la sortie d'une trace de pile que vous générez.

Pour générer une trace de la pile, vous utilisez le code comme ceci:

StackTrace stackTrace = new StackTrace();   
StackFrame[] stackFrames = stackTrace.GetFrames(); 

Le constructeur va générer les données STACKTRACE et .GetFrames() retournera les méthodes pour vous. A partir de ce moment-là, vous pouvez les filtrer comme vous le souhaitez (utiliser stackFrame.GetMethod() pour obtenir les informations de méthode pour chaque trame - soit de filtrer ou de l'ajouter à un StringBuilder pour votre sortie de chaîne, etc.)

Référence: https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v=vs.110).aspx