可能重复:
在异常处理中显示行号
有人可以告诉我如何获取发生错误的代码的行号并将其显示到控制台吗?
文件名或方法名等其他信息将非常方便。
如果您需要文件和行号,则无需解析 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)
您可以通过在可以抛出的代码周围使用 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 上的AppDomain.UncaughtException事件添加处理程序来做到这一点:
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);
}
这显示了与上面类似的输出。
Console.WriteLine(exception.StackTrace);
确保您的应用程序处于Debug
模式或包含调试符号(.mdb 文件)以显示行号。
您可以通过访问 which 是一个字符串来获取堆栈跟踪,以便您可以使用or方法Exception.StackTrace
将其打印到控制台。Write
WriteLine
您可以Exception.StackTrace property
在最后一行的堆栈跟踪 ( ) 中找到它,但前提是您的代码已经编译并包含调试信息。否则行号将是未知的。