25

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

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

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

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

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

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

4

2 回答 2

30

这似乎是“设计使然”。发生的情况是您可能启用了菜单工具选项调试常规启用仅我的代码

作为How to: Break on User-Unhandled Exceptions状态:

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

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

因此有两种解决方法:在菜单工具选项调试常规中禁用仅我的代码从菜单调试异常对话框中的用户未处理的 .NET 框架异常中删除复选框。

于 2010-05-14T01:02:26.660 回答
4

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


原始答案

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

于 2010-04-17T15:36:03.783 回答