Pourquoi la partie haute de la pile (dans Exception.StackTrace) est-elle tronquée? Voyons un exemple simple:Pourquoi la pile est-elle tronquée dans Exception.StackTrace?
public void ExternalMethod()
{
InternalMethod();
}
public void InternalMethod()
{
try
{
throw new Exception();
}
catch(Exception ex)
{
// ex.StackTrace here doesn't contain ExternalMethod()!
}
}
Il semble que cela est « par la conception ». Mais quelles sont les raisons d'un tel design? Cela ne fait que rendre le débogage plus complexe, car dans les messages de journal, je ne peux pas comprendre qui a appelé InternalMethod() et cette information est souvent nécessaire.
Quant aux solutions (pour ceux qui ne savent pas), il y a 2 solutions générales que je comprends:
1) Nous pouvons connecter la propriété statique Environment.StackTrace, qui contient l'ensemble de la pile (par exemple, à partir de le niveau le plus élevé (file d'attente de messages) et se terminant à la méthode la plus profonde dans laquelle une exception se produit).
2) Nous devons saisir et enregistrer les exceptions aux niveaux les plus élevés. Quand nous avons besoin d'intercepter des exceptions sur des niveaux inférieurs pour faire quelque chose, nous devons le relancer (avec une instruction "throw" en C#) plus haut.
Mais la question est sur les raisons d'une telle conception.
Votre point (2), en ce sens que l'exception devrait être relancée, est la bonne approche. –
Principalement les informations de trace de pile sont incluses avec exception à des fins de débogage. Avec la conception existante, cela n'aide pas le débogage autant que si elle avait aussi une partie plus élevée de la pile. Parce que, encore une fois je le répète, savoir qui a appelé la méthode peut être très utile pour le débogage. – nightcoder