为什么IDE会将TargetInvocationException视为未捕获?

我有一些代码使用reflection来从对象中提取属性值。 在某些情况下,属性可能会抛出exception,因为它们具有空引用等。

object result; try { result = propertyInfo.GetValue(target, null); } catch (TargetInvocationException ex) { result = ex.InnerException.Message; } catch (Exception ex) { result = ex.Message; } 

最终代码正常工作,但是当我在调试器下运行时:

当属性抛出exception时,IDE将进入调试器,就好像exception未被捕获一样。 如果我刚刚运行,程序就会流出,exception作为TargetInvocationException出现,并在InnerException属性中有真正的exception。

我怎么能阻止这种情况发生?

这似乎是“按设计”。 会发生什么情况,您可能有菜单工具选项调试常规启用仅启用我的代码

如何:打破用户未处理的exception状态:

当启用“启用我的代码”时,“ 调试” →“ 例外”对话框会显示一个附加列(当用户未处理exception时中断)。

从本质上讲,这意味着每当exception离开代码的边界时(在这种情况下,它会落到.NET框架reflection代码中),Visual Studio会中断,因为它认为exception已经离开了用户代码。 它不知道它将在稍后的堆栈中返回到用户代码。

因此,有两种解决方法:在菜单“ 工具” →“ 选项” →“ 调试” →“ 常规 中禁用“ 仅我的代码”或者从菜单“ 调试” →“ 例外”对话框中的“用户未处理的.NET Frameworkexception”中删除复选框。

编辑:我自己刚试过这个,看起来reflection的处理方式略有不同。 就调试器而言,您可能希望将reflection调用视为启动“处理”的新级别:没有任何东西在它被转换并作为TargetInvocationException抛出之前捕获该exception,因此它会中断。我不会知道是否有任何方法可以抑制 – 但它经常发生吗? 如果您经常执行导致exception的大量操作,您可能需要重新考虑您的设计。


原始答案

转到Debug / Exceptions …并查看设置。 如果TargetInvocationException (或层次结构中更高的任何内容)选中了“Thrown”复选框,您将看到此行为。