我有一个使用反射来从对象拉属性值一些代码。 在某些情况下,性能可能会抛出异常,因为他们有空引用,等等。
object result;
try
{
result = propertyInfo.GetValue(target, null);
}
catch (TargetInvocationException ex)
{
result = ex.InnerException.Message;
}
catch (Exception ex)
{
result = ex.Message;
}
最终的代码工作正常,但是当我在调试器下运行:
当属性抛出一个异常,则IDE落入调试仿佛例外是未捕获的。 如果我只是打运行,程序流经和异常出来,与在InnerException属性真正异常的TargetInvocationException。
我怎样才能阻止这种情况发生?
这似乎是“设计”。 什么情况是,你可能有菜单工具 → 选项 → 调试 → 常规 → 启动启用仅我的代码 。
至于如何:对用户未处理的异常中断状态:
调试 → 例外对话框中显示的附加列(休息的时候例外是用户未处理)当“启用仅我的代码”是。
从本质上讲,这意味着每当异常离开你的代码的边界(在这种情况下,它属于通过下调到.NET框架的反射代码),Visual Studio的突破,因为它认为,除了已经离开的用户代码。 它不知道它会在堆栈稍后返回到用户代码。
因此,有两种解决方法: 仅禁用我的菜单工具 代码 → 选项 → 调试 → 常规 或从菜单调试 → 例外对话框中的用户未处理的.NET Framework异常删除的复选框。
编辑:我只是尝试这样做我自己,它看起来像反射处理略有不同。 你可能要考虑的反映电话为起始“处理”的一个新的水平,只要调试器而言:没有什么是没收异常之前,它被翻译并重新抛出一个TargetInvocationException
,因此它打破了我不知道如果有一种抑制任何方式 - 但是否经常发生? 如果你经常进行大量这导致异常的操作,你可能要重新考虑你的设计。
原来的答案
转到调试/例外...,看到的设置是什么。 你会看到此行为如果TargetInvocationException
(或任何层次更高)具有“时抛出” tickbox检查。