Обработка стека вызова исключения .NET
При генерации исключения в .NET мы имеем достаточно подробную информацию о том, что произошло. Одна из важнейших частей — стек вызовов. В самом исключении стек вызовов представлен в виде строки. Однако, в .NET существует объект StackTrace
, который позволяет работать со стеком вызовов более удобно.
Чтобы обработать стек вызовов, при перехвате исключения создадим объект StackTrace
, в конструкторе которого передадим исключение. В этом случае мы сможем отследить все шаги, которые предшествовали генерации исключения.
Чтобы посмотреть как это работает создадим класс-заглушку, который будет генерировать для нас исключение.
public static class SomeWorker
{
public static void Start()
{
DoSomething1();
}
public static void DoSomething1()
{
DoSomething2();
}
public static void DoSomething2()
{
DoSomething3();
}
public static void DoSomething3()
{
DoSomething4();
}
public static void DoSomething4()
{
DoSomething5();
}
public static void DoSomething5()
{
throw new ArgumentException();
}
}
Чтобы обработать стек вызовов, при перехвате исключения создадим объект StackTrace
, в конструкторе которого передадим исключение. В этом случае мы сможем отследить все шаги, которые предшествовали генерации исключения.
try
{
SomeWorker.Start();
}
catch (Exception ex)
{
var stack = new StackTrace(ex);
foreach (StackFrame frame in stack.GetFrames())
{
Console.WriteLine(frame.GetMethod());
}
}

Использование объекта StackTrace
бывает удобно, если вы пытаетесь анализировать ошибки более глубоко и системно. Например, таким образом можно собрать информацию по всем классам/методам, которые больше всего подвержены генерации необработанных исключений.
Добавить комментарий