Odpowiedzi:
Spójrz na System.Diagnosticsprzestrzeń 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.StackTracejest 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.StackTracewłaśnie pojawiło się nowe wystąpienie StackTrace.
System.Environment.StackTracemoże być wygodniejszym sposobem uzyskiwania dostępu do tych informacji.
System.Diagnostics.StackTrace- patrz msdn.microsoft.com/en-us/library/…
Environment.StackTracezawsze 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 Threadinstancji, 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.WriteLineswoją Logmetodą. 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ć
StackTracejest wolny - używaj go oszczędnie.