异常处理 - 显示发生错误的行号?

时间:2010-04-27 17:48:09

标签: c# exception line show

  

可能重复:
  Show line number in exception handling

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

文件名或方法名等其他信息非常方便。

5 个答案:

答案 0 :(得分:14)

如果需要文件和行号,则无需解析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)

答案 1 :(得分:10)

您可以使用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);
}

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

答案 2 :(得分:5)

Console.WriteLine(exception.StackTrace);

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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