Odpowiedzi:
Spójrz na System.Diagnostics
przestrzeń nazw. Wiele gadżetów!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Naprawdę dobrze jest się wkurzyć, aby dowiedzieć się, co się dzieje pod maską.
Polecam przyjrzeć się rozwiązaniom rejestrowania (takim jak NLog, log4net lub wzorce i praktyki Microsoft Enterprise Library), które mogą osiągnąć twoje cele, a następnie niektóre. Powodzenia, kolego!
Alternatywą System.Diagnostics.StackTrace
jest użycie System.Environment.StackTrace, która zwraca ciąg reprezentacji stosu.
Inną przydatną opcją jest użycie zmiennych$CALLER
i $CALLSTACK
debugowanie w Visual Studio, ponieważ można to włączyć w czasie wykonywania bez przebudowywania aplikacji.
Environment.StackTrace
właśnie pojawiło się nowe wystąpienie StackTrace
.
System.Environment.StackTrace
może być wygodniejszym sposobem uzyskiwania dostępu do tych informacji.
System.Diagnostics.StackTrace
- patrz msdn.microsoft.com/en-us/library/…
Environment.StackTrace
zawsze zaczyna się od at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? To nie jest część aktualnego śladu stosu w momencie, gdy ktoś go szuka.
Można to zrobić na dwa sposoby. System.Diagnostics.StackTrace()
Daje ślad stosu dla bieżącego wątku. Jeśli masz odwołanie do Thread
instancji, możesz uzyskać ślad stosu dla tego poprzez przeciążoną wersję StackTrace()
.
Możesz także sprawdzić pytanie Przepełnienie stosu Jak uzyskać śledzenie stosu nieaktualnego wątku? .
Można to również zrobić w debugerze programu Visual Studio bez modyfikowania kodu.
Oczywiście nie pomaga to, jeśli uruchamiasz kod na innym komputerze, ale może być całkiem przydatne, aby móc wypluć ślad stosu automatycznie bez wpływu na kod wersji lub nawet bez konieczności ponownego uruchamiania programu.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
Dane wyjściowe będą podobne do:
w YourNamespace.Program.executeMethod (ciąg msg)
at YourNamespace.Program.Main (Argumenty String [])
Zastąp Console.WriteLine
swoją Log
metodą. W rzeczywistości nie ma potrzeby stosowania .ToString()
konsoli Console.WriteLine, ponieważ akceptuje
object
. Ale może być to potrzebne do metody 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]);
}
}
Wydaje się dla mnie pracować
StackTrace
jest wolny - używaj go oszczędnie.