我有一些代码使用反射来从对象中提取属性值。在某些情况下,属性可能会抛出异常,因为它们具有空引用等。
object result;
try
{
result = propertyInfo.GetValue(target, null);
}
catch (TargetInvocationException ex)
{
result = ex.InnerException.Message;
}
catch (Exception ex)
{
result = ex.Message;
}
最终代码正常工作,但是当我在调试器下运行时:
当属性抛出异常时,IDE会进入调试器,就好像异常未被捕获一样。如果我只是点击运行,程序就会流过,并且异常作为TargetInvocationException出现,而InnerException属性中有真正的异常。
如何阻止这种情况发生?
答案 0 :(得分:30)
这似乎是“按设计”。会发生什么情况,您可能有菜单工具→选项→调试→常规→启用Just My代码已启用。
正如 How to: Break on User-Unhandled Exceptions 所述:
调试→例外对话框在“启用我的代码”打开时显示另一列(当用户未处理异常时中断)。
基本上这意味着每当异常离开代码的边界时(在这种情况下,它会落到.NET框架反射代码中),Visual Studio会中断,因为它认为异常已经离开了用户代码。它不知道它将在稍后的堆栈中返回用户代码。
所以有两种解决方法:在菜单工具→选项→调试→<中禁用仅我的代码 em>常规 或 从菜单调试→例外中的用户未处理的.NET Framework例外中删除复选框对话框。
答案 1 :(得分:4)
TargetInvocationException
重新抛出之前,没有任何异常捕获该异常,因此它会中断。我不知道是否有任何方法可以抑制这种情况 - 但这种情况经常发生吗?如果您经常执行导致异常的大量操作,您可能需要重新考虑您的设计。
原始回答
转到Debug / Exceptions ...并查看设置。如果TargetInvocationException
(或层次结构中更高的任何内容)选中了“Thrown”复选框,您会看到此行为。