Обработка стека вызова исключения .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 бывает удобно, если вы пытаетесь анализировать ошибки более глубоко и системно. Например, таким образом можно собрать информацию по всем классам/методам, которые больше всего подвержены генерации необработанных исключений.