确定哪个代码行引发了异常

时间:2009-06-29 00:12:28

标签: c# exception stack stackframe

在dotNet中,一行引发异常并被捕获,如何确定哪个文件在哪个行引发异常?看起来相对简单,但我无法弄清楚......

4 个答案:

答案 0 :(得分:6)

只有在有可用的调试符号时才能执行此操作。

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

如果您想在VS中调试此类情况,最好只检查Thrown菜单中Common Language Runtime Exceptions对话框中Exceptions的{​​{1}}复选框。一旦抛出异常,调试器就会中断,即使它位于Debug块中。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

好吧,在.NET中你有什么叫做FirstChanceException。这些基本上是在处理异常之前抛出的。有两种方法可以查看您在此处提出的问题。一个是从调试角度。如果进行调试,您可以将调试器设置为从Debug / Exceptions窗口中捕获抛出的异常。这在交互式环境中更容易。如果您需要在非交互式环境中记录此信息,那么我会做类似于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,然后转到第一帧,这是最初抛出异常的地方。