Обработка исключений — число Строки дисплея, где ошибка произошла? [дубликат]

11
задан Community 23 May 2017 в 10:29
поделиться

5 ответов

Вы может распечатать всю трассировку стека, используя команду try / catch вокруг кода, который может генерировать, а затем использовать Console.WriteLine для отображения объекта исключения:

try
{
    new Program().Run();
}
catch (Exception exception)   // Prefer to catch a more specific execption.
{
    Console.WriteLine(exception);
}

Вывод:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Program.Run() in C:\Console Application1\Program.cs:line 37
   at Program.Main(String[] args) in C:\Console Application1\Program.cs:line 45

Первая строка показывает тип исключения и сообщения. Вторая строка показывает файл, функцию и номер строки, в которой возникло исключение. Вы также можете увидеть расположение других вызовов в стеке вызовов в следующих строках.

Вы также можете получить номера файлов и строк для неперехваченных исключений. Вы можете сделать это, добавив обработчик для события AppDomain.UncaughtException в текущем AppDomain:

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    new Program().Run();
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine(e.ExceptionObject);
}

Это показывает результат, аналогичный приведенному выше.

10
ответ дан 3 December 2019 в 02:40
поделиться

Вы можете получить трассировку стека, открыв Exception.StackTrace , который представляет собой строку, чтобы вы могли распечатать ее на консоли с помощью Write или WriteLine методы.

2
ответ дан 3 December 2019 в 02:40
поделиться
Console.WriteLine(exception.StackTrace);

Убедитесь, что ваше приложение находится в режиме Debug , или включите символы отладки (файл .mdb), чтобы отображались номера строк.

5
ответ дан 3 December 2019 в 02:40
поделиться

Если вам нужны номера файлов и строк, вам не нужно анализировать строку StackTrace. Вы можете использовать System.Diagnostics.StackTrace для создания трассировки стека из исключения, при этом вы можете перечислить кадры стека и получить имя файла, номер строки и столбец, в котором возникло исключение. Вот быстрый и грязный пример того, как это сделать. Проверка ошибок не включена. Для этого должна существовать PDB с отладочными символами, она создается по умолчанию с отладочной сборкой.

using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
  class Program
  {    
    static void Main(string[] args)
    {      
      try
      {
        TestFunction();
      }
      catch (Exception ex)
      {
        StackTrace st = new StackTrace(ex, true);
        StackFrame[] frames = st.GetFrames();

        // Iterate over the frames extracting the information you need
        foreach (StackFrame frame in frames)
        {
          Console.WriteLine("{0}:{1}({2},{3})", frame.GetFileName(), frame.GetMethod().Name, frame.GetFileLineNumber(), frame.GetFileColumnNumber());
        }
      }

      Console.ReadKey();
    }

    static void TestFunction()
    {      
      throw new InvalidOperationException();
    }
  }
}

Вывод приведенного выше кода выглядит следующим образом

D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7)
D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9)
14
ответ дан 3 December 2019 в 02:40
поделиться

Вы можете найти его в трассировке стека ( Свойство Exception.StackTrace ) на последняя строка, но только когда ваш код был скомпилирован с включенной отладочной информацией. В противном случае номер строки будет неизвестен.

0
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: