为什么堆栈跟踪帧不总是包含文件名和行号?

时间:2014-02-26 12:42:55

标签: c# stack-trace

当我编写此代码以查找出现错误的行

// Case 1
try
{   
    var error= Convert.ToInt32("fdafa"); 
}
catch(Exception ex)
{
    StackTrace trace = new StackTrace(ex, true);
    string fileName = trace.GetFrame(0).GetFileName();
    int lineNo = trace.GetFrame(0).GetFileLineNumber(); 
}

// Case 2
try
{   
    throw new Exception();
}
catch(Exception ex)
{
    StackTrace trace = new StackTrace(ex, true);
    string fileName = trace.GetFrame(0).GetFileName();
    int lineNo = trace.GetFrame(0).GetFileLineNumber(); 
}      

当我抛出这样的异常(来自Case 2

时,它正在正常运行
throw new Exception();

但是这样的任何其他编码错误(来自Case 1

var error= Convert.ToInt32("fdafa"); 

将抛出异常,我从fileName得到响应null,从lineNo

得到0

这两种情况的区别是什么?

2 个答案:

答案 0 :(得分:3)

它的发生是因为如果你抛出一个像throw new Exception();这样的异常,你知道引发异常的类,因为是你创建了它,并且你有代码。

如果Convert.ToInt32("fdafa")之类的框架方法抛出异常,则您不知道代码,因此,无法输入行号和文件名。 也许,如果你上一个框架(trace.GetFrame(1))你的类错误地调用了这个方法,你可以提供她的名字和行号。

例如,您可能会注意到,如果您尝试查看Convert类的实现,则不能。

答案 1 :(得分:0)

   

两种情况下,对代码进行两个小的更改即可。


    try
    {   
        var error= Convert.ToInt32("fdafa"); 
    }
    catch(Exception ex)
    {
        StackTrace trace = new StackTrace(ex, true);
        string fileName = trace.GetFrame(trace.FrameCount - 1).GetFileName();
        int lineNo = trace.GetFrame(trace.FrameCount - 1).GetFileLineNumber(); 
    }

这是因为StackTrace帧计数在每种情况下都不同。