正如一些答案所指出的,告诉 Visual Studio 在 Throw 上中断 NullReferenceException。
当抛出未处理的异常时如何告诉 VS 中断
- 调试菜单 |例外(或 Ctrl + Alt + E)
- 深入研究公共语言运行时异常
- 深入系统
- 找到 System.NullReferenceException,并在抛出此异常时选中 Break 框,而不是让它继续执行任何 Catch 块
所以现在当它发生时,VS 将立即中断,当前语句行将位于计算为 null 的表达式上。
这个工具对各种异常都有用,包括自定义异常(可以添加完全限定的类型名,VS会在Debug时匹配)
这种方法的一个缺点是,如果调试器中加载的代码遵循抛出和捕获大量您正在寻找的异常的不良做法,在这种情况下,它又会变成大海捞针/针头问题(除非您当然可以修复该代码 - 那么您已经解决了两个问题:)
另一个可能派上用场的技巧(但仅在某些语言中)是使用 When(或等效)关键字...在 VB 中,这看起来像
Try
' // Do some work '
Catch ex As Exception When CallMethodToInspectException(ex)
End Try
这里的技巧是在调用堆栈展开到 Catch 块之前评估 When 表达式。因此,如果您正在使用调试器,您可以为该表达式设置一个断点,如果您查看调用堆栈窗口 (Debug | Windows | Callstack),您可以查看并导航到触发异常的行。
(您可以选择从 CallMethodToInspectException 返回 false,因此 Catch 块将被忽略,运行时将继续在堆栈中搜索适当的 Catch 块 - 这可以允许不影响行为的日志记录,并且开销比接球和重掷要少)
如果您只是对非交互式日志记录感兴趣,那么假设您有一个 Debug 构建(或者在某种程度上您已经处理了优化问题,使用 PDB 发布构建)您可以获得大部分所需的信息使用包含的 stack-trace-with-line-number 从 Exception ToString 中追踪错误。
如果行号还不够,您也可以通过提取异常的 StackTrace(使用上述技术或仅在catch 块本身):
int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
虽然我没有看到它对 NullReference 或其他运行时生成的异常有什么作用,但可能也有兴趣将 Exception Hunter 视为静态分析工具。