正如一些答案指出的,告诉Visual Studio在抛出NullReferenceException时中断。
如何告诉VS打破时未处理的异常抛出
- 调试菜单|异常(或按Ctrl + Alt键+Ë)
- 钻入通用语言运行时异常
- 钻入系统
- 查找System.NullRefernceException,并检查框打破每当这个异常被抛出,而不是允许它继续执行任何Catch块。
所以现在,当它发生时,VS会立即中断,Current Statement行将被放在表达式中评估为null。
这个设施是所有类型的异常,包括自定义的有用的(可以添加完全限定的类型名称,和VS将调试时间匹配它)
的一个缺点这种方式是否有码加载到调试器中,该调试器遵循抛出的错误做法并捕获许多您正在寻找的异常,在这种情况下,它会变成草垛/针头问题(除非您可以修复该代码 - 然后您已经解决了两个问题:)
另一个可能派上用场的窍门(但只限于某些语言)是使用o F中的当(或等同物)关键字...在VB中,这看起来像
Try
' // Do some work '
Catch ex As Exception When CallMethodToInspectException(ex)
End Try
这里的诀窍在于,当表达式求值之前调用堆栈被退绕至Catch块。因此,如果您使用调试器,则可以设置表达式的断点,并且如果您查看callstack窗口(Debug | Windows | Callstack),则可以看到并导航到触发异常的行。 (您可以选择从CallMethodToInspectException返回false,因此Catch块将被忽略,并且运行时将继续通过堆栈搜索相应的Catch块 - 这可以允许进行不会影响行为的日志记录,并与超过渔获物和再次引发开销更少)
如果你在非交互记录只是感兴趣,那么假设你有一个调试版本(或在一定程度上,你必须做处理优化问题,使用PDB发布构建),您可以获得大部分从Exception ToString跟踪错误所需的信息,包括堆栈跟踪与行号。
但是,如果行号不够,您可以通过为异常提取StackTrace(使用上述技术或仅使用上面的技术)来获得列号(非常多,特定的本地或表达式为null)在catch块本身):
int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
虽然我还没有看到它做什么的NullReference或其他运行时产生的异常,还可能有兴趣在Exception Hunter看作为一个静态分析工具。
我不明白 - 如果您将调试器设置为在NullReferenceExceptions上中断,当然你可以看到哪个变量在引发异常的时候导致了错误? – Grokys 2008-09-22 15:39:57