Ответы:
Посмотрите на 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это собака медленно - так что используйте это экономно.