【问题标题】:Determining which code line threw the exception确定哪个代码行引发了异常
【发布时间】:2010-11-06 13:35:18
【问题描述】:

在 dotNet 中,一行抛出异常并被捕获,我如何确定哪个文件中的哪一行抛出了异常?看起来比较简单,但我想不通...

【问题讨论】:

    标签: c# exception stack stack-frame


    【解决方案1】:

    只有在有可用的调试符号时才能这样做。

    catch(Exception ex) {
        // check the ex.StackTrace property
    }
    

    如果你想在 VS 中调试这样的情况,你最好在 Debug 菜单中的 Exceptions 对话框中选中 Thrown 复选框以找到 Common Language Runtime Exceptions。一旦抛出异常,调试器就会中断,即使它位于 try 块中。

    【讨论】:

      【解决方案2】:

      就我个人而言,我只是记录异常的 ToString() 返回值。包括整个堆栈跟踪。就是一行代码……很简单。

      【讨论】:

        【解决方案3】:

        你可以使用StackFrame Class:

        try
        {
            ...
            ...
        
        }
        catch(...)
        {
            StackFrame sf = new StackFrame(true);
        
            int lineNumber = sf.GetFileLineNumber();
            int colNumber = sf.GetFileColumnNumber();
            string fileName = sf.GetFileName();
            string methodName = sf.GetMethod().Name;
        }
        

        【讨论】:

        • 但是请注意,这将返回 'catch' 子句的信息...而不是引发异常的位置,因为您需要检查异常的 'StackTrace' 属性的内容抓到了!
        • 这个答案是错误的,原因 jerryjvl 已经说明了。这怎么能被认为是正确的?
        【解决方案4】:

        嗯,在 .NET 中,您有所谓的 FirstChanceException。这些本质上是在处理异常之前抛出的。有两种方法可以查看您在此处提出的问题。一是从调试的角度。如果进行调试,您只需将调试器设置为从“调试/异常”窗口捕获抛出的异常。这在交互式环境中更容易。如果您需要在非交互式上下文中记录这些信息,那么我会做一些类似于 CMS 所说的事情......

        try
        {
            ...
        }
        catch(Exception ex)
        {
            System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex);
            System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0];
            Console.WriteLine(firstFrame.GetFileLineNumber);
            ...
        }
        

        这里唯一的区别是我们获取了整个 Stack Trace,然后转到第一帧,也就是最初抛出异常的地方。

        【讨论】:

        • 帧 0 不是当前帧的方法,而不是错误的来源吗?
        猜你喜欢
        • 2019-12-08
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 2021-05-22
        相关资源
        最近更新 更多