6

在 dotNet 中,一行抛出异常并被捕获,我如何确定哪个文件中的哪一行抛出了异常?似乎比较简单,但我无法弄清楚......

4

4 回答 4

6

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

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

如果你想在 VS 中调试这种情况,你最好只在菜单中的对话框中选中Thrown复选框。一旦抛出异常,调试器就会中断,即使它在一个块中。Common Language Runtime ExceptionsExceptionsDebugtry

于 2009-06-29T00:14:15.050 回答
2

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

于 2009-06-29T01:00:35.220 回答
1

您可以使用StackFrame 类

try
{
    ...
    ...

}
catch(...)
{
    StackFrame sf = new StackFrame(true);

    int lineNumber = sf.GetFileLineNumber();
    int colNumber = sf.GetFileColumnNumber();
    string fileName = sf.GetFileName();
    string methodName = sf.GetMethod().Name;
}
于 2009-06-29T00:18:23.763 回答
1

好吧,在 .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,然后转到第一帧,也就是最初抛出异常的地方。

于 2009-06-29T00:30:14.767 回答