代码之家  ›  专栏  ›  技术社区  ›  Jason Coyne

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

  •  25
  • Jason Coyne  · 技术社区  · 16 年前

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

    object result;
    try
    {
        result = propertyInfo.GetValue(target, null);
    
    }
    catch (TargetInvocationException ex)
    {
        result = ex.InnerException.Message;
    }
    catch (Exception ex)
    {
        result = ex.Message;
    }
    

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

    当属性抛出异常时,IDE将像未捕获异常一样放入调试器。如果我刚点击run,程序就会通过,异常会以targetInvocationException的形式出现,在innerException属性中会出现真正的异常。

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

    2 回复  |  直到 9 年前
        1
  •  29
  •   Kirill Osenkov    9 年前

    这似乎是“按设计”。你可能有菜单 工具 艾斯 选项 艾斯 调试 艾斯 一般 艾斯 启用“仅我的代码” 启用。

    AS How to: Break on User-Unhandled Exceptions 国家:

    这个 调试 艾斯 例外情况 当启用“仅启用我的代码”时,对话框将显示一个附加列(在用户未处理异常时中断)。

    从本质上来说,这意味着每当异常离开代码边界(在本例中,它是通过.NET框架反射代码),Visual Studio就会中断,因为它认为异常离开了用户代码。它不知道它稍后会返回到堆栈中的用户代码中。

    所以有两种解决方法:禁用 只是我的代码 菜单中 工具 艾斯 选项 艾斯 调试 艾斯 一般 删除菜单中用户未处理的.NET框架异常的复选框 调试 艾斯 例外情况 对话框。

        2
  •  4
  •   Jon Skeet    16 年前

    编辑:我自己也试过,看起来反射的处理方式有点不同。就调试器而言,您可能希望将反射调用视为启动新的“已处理”级别:在将该异常转换为 TargetInvocationException ,所以它突然出现。我不知道有没有什么方法可以抑制这种情况——但这种情况经常发生吗?如果您经常执行许多操作,从而导致异常,那么您可能需要重新考虑您的设计。


    原始答案

    转到调试/异常…看看设置是什么。你会看到这种行为如果 目标调用异常 (或更高层次结构中的任何内容)选中了“抛出”复选框。