Antworten:
Schauen Sie sich den System.Diagnostics
Namespace an. Viele Leckereien drin!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Es ist wirklich gut, sich umzuschauen, um zu erfahren, was unter der Haube vor sich geht.
Ich würde empfehlen, dass Sie sich mit Protokollierungslösungen (wie NLog, log4net oder den Microsoft-Mustern und -Praktiken der Enterprise Library) befassen, die möglicherweise Ihre Ziele erreichen, und noch einige mehr. Viel Glück, Junge!
Eine Alternative dazu System.Diagnostics.StackTrace
ist die Verwendung von System.Environment.StackTrace, das eine Zeichenfolgendarstellung des Stacktraces zurückgibt.
Eine weitere nützliche Option ist die Verwendung der Variablen$CALLER
und $CALLSTACK
Debugging in Visual Studio, da dies zur Laufzeit aktiviert werden kann, ohne die Anwendung neu zu erstellen.
Environment.StackTrace
Nur neu ist eine Instanz von StackTrace
.
System.Environment.StackTrace
könnte aber eine bequemere Möglichkeit sein, auf diese Informationen zuzugreifen.
System.Diagnostics.StackTrace
- siehe msdn.microsoft.com/en-us/library/…
Environment.StackTrace
immer damit beginnt at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Dies ist nicht Teil der aktuellen Stapelverfolgung, da an dem Punkt, an dem jemand danach sucht.
Es gibt zwei Möglichkeiten, dies zu tun. Das System.Diagnostics.StackTrace()
gibt Ihnen einen Stack-Trace für den aktuellen Thread. Wenn Sie einen Verweis auf eine Thread
Instanz haben, können Sie den Stack-Trace dafür über die überladene Version von abrufen StackTrace()
.
Vielleicht möchten Sie auch die Frage zum Stapelüberlauf lesen. Wie erhalte ich die Stapelverfolgung eines nicht aktuellen Threads? .
Sie können dies auch im Visual Studio-Debugger tun, ohne den Code zu ändern.
Dies hilft natürlich nicht, wenn Sie den Code auf einem anderen Computer ausführen, aber es kann sehr praktisch sein, einen Stack-Trace automatisch auszuspucken, ohne den Release-Code zu beeinflussen oder das Programm neu starten zu müssen.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
Die Ausgabe ist ähnlich wie:
at YourNamespace.Program.executeMethod (String msg)
at YourNamespace.Program.Main (String [] args)
Ersetzen Sie Console.WriteLine
durch Ihre Log
Methode. Tatsächlich ist .ToString()
der Console.WriteLine-Fall nicht erforderlich, da er akzeptiert wird
object
. Möglicherweise benötigen Sie dies jedoch für Ihre Protokollmethode (Zeichenfolge 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]);
}
}
Scheint für mich zu arbeiten
StackTrace
ist Hund langsam - es ist so sparsam zu verwenden.