异常处理——显示发生错误的行号? [复制]

Posted

技术标签:

【中文标题】异常处理——显示发生错误的行号? [复制]【英文标题】:Exception handling -- Display line number where error occurred? [duplicate] 【发布时间】:2010-04-27 17:48:08 【问题描述】:

可能重复:Show line number in exception handling

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

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

【问题讨论】:

重复***.com/questions/8338495/… 【参考方案1】:

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

【讨论】:

这是一个很好的例子。 frames[0] 总是有方法、行号、列号和文件名吗?我们可以直接分配字符串 lineNumber = frames[0].GetFileLineNumber() 等值,而不是循环遍历所有 20 帧或总数 @JoshYates1980,文件名、行和列只有在您包含调试信息时才可用。您可以按索引访问帧,当然您应该检查您尝试访问的索引是否存在,否则您将收到 IndexOutOfRangeException。【参考方案2】:

您可以通过在可以抛出的代码周围使用 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);

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

【讨论】:

这不适用于 MessageBox 类。【参考方案3】:
Console.WriteLine(exception.StackTrace);

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

【讨论】:

实际上,您需要调试符号(.mdb 文件)才能显示行号。构建配置与它们无关。 +1 用于指出调试模式。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于异常处理——显示发生错误的行号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 控制台:发生错误/异常/警告时如何显示行号

JavaScript 异常处理 - 显示行号

Java基础之异常处理

16 Java中异常的处理

马士兵java教程笔记3

PHP的错误和异常处理