Wie der aktuellen Stack-Trace in .NET ohne jede Ausnahme drucken?
-
22-08-2019 - |
Frage
Ich habe einen regulären C # -Code. Ich habe keine Ausnahmen . Ich möchte programmatisch den aktuellen Stack-Trace einzuloggen Zweck für das Debuggen. Beispiel:
public void executeMethod()
{
logStackTrace();
method();
}
Lösung
Haben Sie einen Blick auf die System.Diagnostics
Namespace. Viele gute Sachen drin!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Das ist wirklich gut, einen Sack zu haben, um in, was los ist unter der Haube zu lernen.
Ich würde empfehlen, dass Sie einen Blick in der Logging-Lösungen (wie NLog, log4net oder das Microsoft-Muster und Praktiken Enterprise Library), die Ihre Ziele erreichen können und dann einige. Viel Glück Kumpel!
Andere Tipps
Eine Alternative zu System.Diagnostics.StackTrace
ist System.Environment.StackTrace zu verwenden, die gibt eine String-Darstellung des Stacktrace.
Eine weitere nützliche Option ist die $CALLER
und $CALLSTACK
Debug-Variablen in Visual Studio zu verwenden da dies ohne den Wiederaufbau der Anwendung aktiviert Laufzeit werden.
Es gibt zwei Möglichkeiten, dies zu tun. Die System.Diagnostics.StackTrace()
geben Ihnen einen Stack-Trace für den aktuellen Thread. Wenn Sie einen Verweis auf eine Thread
Instanz haben, können Sie den Stack-Trace für die über die überladene Version von StackTrace()
zu bekommen.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
wird die Ausgabe ähnlich sein:
bei YourNamespace.Program.executeMethod (String msg)
bei YourNamespace.Program.Main (String [] args)
Ersetzen Console.WriteLine
mit Ihrer Log
Methode. Eigentlich gibt es
keine Notwendigkeit für .ToString()
für den Console.WriteLine Fall, da es akzeptiert
object
. Sie können jedoch, dass für Ihren Log (string msg) -Methode.
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]);
}
}
Es scheint für mich zu arbeiten