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

Jas*_*yne 25 c# reflection exception propertyinfo targetinvocationexception

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

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

}
catch (TargetInvocationException ex)
{
    result = ex.InnerException.Message;
}
catch (Exception ex)
{
    result = ex.Message;
}
Run Code Online (Sandbox Code Playgroud)

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

当属性抛出异常时,IDE将进入调试器,就好像异常未被捕获一样.如果我刚刚运行,程序就会流出,异常作为TargetInvocationException出现,并在InnerException属性中有真正的异常.

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

Kir*_*kov 30

这似乎是"按设计".会发生什么情况,您可能有菜单工具选项调试常规启用仅启用我的代码.

至于如何:对用户未处理的异常中断状态:

调试例外对话框中显示的附加列(休息的时候例外是用户未处理)当"启用仅我的代码"是.

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

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