Обработка исключений - отображает номер строки, в которой произошла ошибка?
Возможный дубликат:
Показать номер строки в обработке исключений
Может кто-нибудь рассказать мне, как получить номер строки кода, где произошла ошибка, и отобразить ее на консоли?
Другая информация, такая как имя файла или имя метода, будет очень удобной.
Ответы
Ответ 1
Вы можете распечатать всю трассировку стека, используя 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);
}
Это показывает аналогичный вывод выше.
Ответ 2
Если вам нужны номера файлов и строк, вам не нужно разбирать строку 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)
Ответ 3
Console.WriteLine(exception.StackTrace);
Убедитесь, что ваше приложение находится в режиме Debug
или содержат символы отладки (файл .mdb), чтобы номера строк отображались.
Ответ 4
Вы можете получить трассировку стека, обратившись к Exception.StackTrace
, которая является строкой, поэтому вы можете распечатать ее на консоли с помощью методов Write
или WriteLine
.
Ответ 5
Вы можете найти его в трассировке стека (Exception.StackTrace property
) в последней строке, но только тогда, когда ваш код был скомпилирован с включенной отладочной информацией. В противном случае номер строки будет неизвестен.