exception处理 – 显示发生错误的行号?

可能重复:
在exception处理中显示行号

有人可以告诉我如何获取发生错误的代码的行号并将其显示到控制台?

其他信息,如文件名或方法名称将非常方便。

您可以使用try / catch围绕可抛出的代码打印整个堆栈跟踪,然后使用Console.WriteLine显示exception对象:

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 

第一行显示exception的类型和消息。 第二行显示抛出exception的文件,函数和行号。 您还可以在以下行中查看调用堆栈上其他调用的位置。

您还可以获取未捕获exception的文件和行号。 您可以通过在当前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); } 

这显示了与上面类似的输出。

如果需要文件和行号,则无需解析StackTrace字符串。 您可以使用System.Diagnostics.StackTrace从exception创建堆栈跟踪,这样您就可以枚举堆栈帧并获取引发exception的文件名,行号和列。 这是一个如何做到这一点的快速而肮脏的例子。 没有包含错误检查。 为此,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:\源\ NGTests \ ConsoleApplication1 \的Program.cs:TestFunction(30,7)
 d:\源\ NGTests \ ConsoleApplication1 \ Program.cs的:主(11,9)
 Console.WriteLine(exception.StackTrace); 

确保您的应用程序处于Debug模式或包含调试符号(.mdb文件)以便显示行号。

您可以通过访问Exception.StackTrace来获取堆栈跟踪,这是一个字符串,因此您可以使用WriteWriteLine方法将其打印到控制台。

您可以在最后一行的堆栈跟踪( Exception.StackTrace property )中找到它,但仅当您的代码编译时包含调试信息时才能找到它。 否则,行号将是未知的。