确定哪个代码行引发了exception

在dotNet中,一行引发exception并被捕获,如何确定哪个文件中的哪一行引发了exception? 看起来相对简单,但我无法弄明白……

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

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

如果要在VS中调试这种情况,最好只检查“ Debug菜单中“ Common Language Runtime Exceptions中的“ Common Language Runtime Exceptions Exceptions对话框中的“ Thrown复选框。 一旦抛出exception,调试器就会中断,即使它在try块中也是如此。

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

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

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

这里唯一的区别是我们得到整个堆栈跟踪,然后转到第一帧,这是最初抛出exception的地方。