Ответы:
Посмотрите на System.Diagnostics
пространство имен. Там много вкусностей!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Это действительно хорошо, чтобы покопаться, чтобы узнать, что происходит под капотом.
Я бы порекомендовал вам взглянуть на решения для ведения журналов (такие как NLog, log4net или корпоративная библиотека шаблонов и практик Microsoft), которые могут достичь ваших целей, а затем и некоторых. Удачи, приятель!
Альтернативой System.Diagnostics.StackTrace
является использование System.Environment.StackTrace, которое возвращает строковое представление трассировки стека.
Другой полезный вариант - использовать переменные$CALLER
и $CALLSTACK
отладки в Visual Studio, поскольку это можно включить во время выполнения без перестройки приложения.
Environment.StackTrace
просто новый пример StackTrace
.
System.Environment.StackTrace
может быть более удобным способом доступа к этой информации.
System.Diagnostics.StackTrace
- см. Msdn.microsoft.com/en-us/library/…
Environment.StackTrace
всегда начинается с at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Это не является частью текущей трассировки стека, поскольку кто-то ищет ее.
Есть два способа сделать это. Это System.Diagnostics.StackTrace()
даст вам трассировку стека для текущего потока. Если у вас есть ссылка на Thread
экземпляр, вы можете получить трассировку стека для этого через перегруженную версию StackTrace()
.
Вы также можете проверить вопрос переполнения стека. Как получить трассировку стека нетокового потока? ,
Вы также можете сделать это в отладчике Visual Studio без изменения кода.
Конечно, это не помогает, если вы запускаете код на другом компьютере, но может быть очень удобно иметь возможность автоматически выплевывать трассировку стека, не затрагивая код выпуска или даже без необходимости перезапуска программы.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
Вывод будет похож на:
на YourNamespace.Program.executeMethod (Строка сообщения)
at YourNamespace.Program.Main (String [] args)
Замените Console.WriteLine
своим Log
методом. На самом деле, нет необходимости .ToString()
в случае Console.WriteLine, как он принимает
object
. Но вам может понадобиться это для вашего метода 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]);
}
}
Кажется, работает на меня
StackTrace
это собака медленно - так что используйте это экономно.