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

时间:2010-04-17 15:31:57

标签: c# exception reflection propertyinfo targetinvocationexception

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

object result;
try
{
    result = propertyInfo.GetValue(target, null);

}
catch (TargetInvocationException ex)
{
    result = ex.InnerException.Message;
}
catch (Exception ex)
{
    result = ex.Message;
}

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

当属性抛出异常时,IDE会进入调试器,就好像异常未被捕获一样。如果我只是点击运行,程序就会流过,并且异常作为TargetInvocationException出现,而InnerException属性中有真正的异常。

如何阻止这种情况发生?

2 个答案:

答案 0 :(得分:30)

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

正如 How to: Break on User-Unhandled Exceptions 所述:

调试例外对话框在“启用我的代码”打开时显示另一列(当用户未处理异常时中断)。

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

所以有两种解决方法:在菜单工具选项调试→<中禁用仅我的代码 em>常规 从菜单调试例外中的用户未处理的.NET Framework例外中删除复选框对话框。

答案 1 :(得分:4)

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


原始回答

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