为什么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”复选框,您将看到此行为。