Відповіді:
Погляньте на System.Diagnostics
простір імен. Багато смаколиків там!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Це дійсно добре, щоб тикатися, щоб дізнатися, що відбувається під кришкою.
Я рекомендую вам ознайомитись із рішеннями для реєстрації даних (наприклад, NLog, log4net або шаблонами та практиками корпорації Майкрософт), які можуть досягти ваших цілей, а потім і деяких. Успіхів товариш!
Альтернативою 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 (String msg)
на 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
це собака повільно - так що використовуйте його з обережністю.