为什么TargetInvocationException由IDE视为未捕获的?为什么TargetIn

2019-05-11 21:59发布

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

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

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

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

当属性抛出一个异常,则IDE落入调试仿佛例外是未捕获的。 如果我只是打运行,程序流经和异常出来,与在InnerException属性真正异常的TargetInvocationException。

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

Answer 1:

这似乎是“设计”。 什么情况是,你可能有菜单工具选项调试常规启动启用仅我的代码

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

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

从本质上讲,这意味着每当异常离开你的代码的边界(在这种情况下,它属于通过下调到.NET框架的反射代码),Visual Studio的突破,因为它认为,除了已经离开的用户代码。 它不知道它会在堆栈稍后返回到用户代码。

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



Answer 2:

编辑:我只是尝试这样做我自己,它看起来像反射处理略有不同。 你可能要考虑的反映电话为起始“处理”的一个新的水平,只要调试器而言:没有什么是没收异常之前,它被翻译并重新抛出一个TargetInvocationException ,因此它打破了我不知道如果有一种抑制任何方式 - 但是否经常发生? 如果你经常进行大量这导致异常的操作,你可能要重新考虑你的设计。


原来的答案

转到调试/例外...,看到的设置是什么。 你会看到此行为如果TargetInvocationException (或任何层次更高)具有“时抛出” tickbox检查。



文章来源: Why is TargetInvocationException treated as uncaught by the IDE?