Відповіді:
Погляньте на 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це собака повільно - так що використовуйте його з обережністю.