Risposte:
Dai un'occhiata allo System.Diagnostics
spazio dei nomi. Un sacco di chicche lì dentro!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
È davvero bello dare un'occhiata in giro per imparare cosa succede sotto il cofano.
Ti consiglierei di dare un'occhiata alle soluzioni di registrazione (come NLog, log4net o la libreria Enterprise di modelli e pratiche di Microsoft) che potrebbero raggiungere i tuoi scopi e poi alcuni. Buona fortuna amico!
Un'alternativa System.Diagnostics.StackTrace
è utilizzare System.Environment.StackTrace che restituisce una rappresentazione in formato stringa dello stacktrace.
Un'altra opzione utile è utilizzare le variabili di debug$CALLER
e $CALLSTACK
in Visual Studio poiché può essere abilitato in fase di esecuzione senza ricostruire l'applicazione.
Environment.StackTrace
solo una novità è un'istanza di StackTrace
.
System.Environment.StackTrace
potrebbe essere un modo più conveniente di accedere a tali informazioni.
System.Diagnostics.StackTrace
- vedi msdn.microsoft.com/en-us/library/...
Environment.StackTrace
inizia sempre con at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Non fa parte della traccia dello stack corrente come nel punto in cui qualcuno la sta cercando.
Ci sono due modi per farlo. Il System.Diagnostics.StackTrace()
vi darà una traccia dello stack per il thread corrente. Se si ha un riferimento a Thread
un'istanza, è possibile ottenere la traccia dello stack per tale tramite la versione sovraccarica di StackTrace()
.
Potresti anche voler dare un'occhiata alla domanda Stack Overflow Come ottenere lo stacktrace del thread non corrente? .
È inoltre possibile farlo nel debugger di Visual Studio senza modificare il codice.
Naturalmente, questo non aiuta se stai eseguendo il codice su un altro computer, ma può essere abbastanza utile essere in grado di sputare automaticamente una traccia dello stack senza influire sul codice di rilascio o senza nemmeno dover riavviare il programma.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
L'output sarà simile a:
at YourNamespace.Program.executeMethod (String msg)
at YourNamespace.Program.Main (String [] args)
Sostituisci Console.WriteLine
con il tuo Log
metodo. In realtà, non è necessario .ToString()
per il caso Console.WriteLine come accetta
object
. Ma potresti averne bisogno per il tuo metodo 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]);
}
}
Sembra funzionare per me
StackTrace
è lento , quindi usalo con parsimonia.