Réponses:
Jetez un œil à l' System.Diagnostics
espace de noms. Beaucoup de goodies là-dedans!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
C'est vraiment bien d'avoir un coup d'œil pour savoir ce qui se passe sous le capot.
Je vous recommande de jeter un œil aux solutions de journalisation (telles que NLog, log4net ou les modèles et pratiques Microsoft Enterprise Library) qui peuvent atteindre vos objectifs, puis certaines. Bonne chance mec!
Une alternative à System.Diagnostics.StackTrace
consiste à utiliser System.Environment.StackTrace qui retourne une représentation sous forme de chaîne de la trace de pile.
Une autre option utile consiste à utiliser les variables de débogage$CALLER
et $CALLSTACK
dans Visual Studio car cela peut être activé au moment de l'exécution sans reconstruire l'application.
Environment.StackTrace
juste nouveau est une instance de StackTrace
.
System.Environment.StackTrace
pourrait être un moyen plus pratique d'accéder à ces informations.
System.Diagnostics.StackTrace
- voir msdn.microsoft.com/en-us/library/…
Environment.StackTrace
commence toujours par at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Cela ne fait pas partie de la trace de pile actuelle au moment où quelqu'un la recherche.
Il y a deux façons de faire ça. Le System.Diagnostics.StackTrace()
vous donnera une trace de pile pour le thread actuel. Si vous avez une référence à une Thread
instance, vous pouvez obtenir la trace de pile pour cela via la version surchargée de StackTrace()
.
Vous pouvez également consulter la question de dépassement de pile Comment obtenir la trace de pile d'un thread non actuel? .
Vous pouvez également le faire dans le débogueur Visual Studio sans modifier le code.
Bien sûr, cela n'aide pas si vous exécutez le code sur une autre machine, mais il peut être très pratique de pouvoir cracher automatiquement une trace de pile sans affecter le code de publication ou sans même avoir besoin de redémarrer le programme.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
La sortie sera similaire à:
à YourNamespace.Program.executeMethod (String msg)
à YourNamespace.Program.Main (String [] args)
Remplacez Console.WriteLine
par votre Log
méthode. En fait, il n'est pas nécessaire .ToString()
pour le boîtier Console.WriteLine comme il l'accepte
object
. Mais vous en aurez peut-être besoin pour votre méthode Log (string msg).
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
Semble travailler pour moi
StackTrace
est lent - utilisez-le avec parcimonie.