当我编写此代码以查找出现错误的行
// 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 :(得分: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帧计数在每种情况下都不同。