【问题标题】:Why is TargetInvocationException treated as uncaught by the IDE?为什么 TargetInvocationException 被 IDE 视为未捕获?
【发布时间】:2011-02-09 04:13:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# exception reflection propertyinfo targetinvocationexception


    【解决方案1】:

    这似乎是“设计使然”。发生的情况是您可能有菜单 ToolsOptionsDebuggingGeneralEnable Just My代码 已启用。

    正如 How to: Break on User-Unhandled Exceptions 所说:

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

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

    所以有两种解决方法:在菜单中禁用 Just My Code ToolsOptionsDebugging → General or 从菜单DebugExceptions 中的 User-unhandled .NET Framework exceptions 中删除复选框 对话框。

    【讨论】:

    • 确实,这有帮助:我在某个地方出现了字符串格式错误(试图以 int 格式显示 TimeSpan,而不是天数)并收到此错误。内部异常:格式字符串不正确。但是如何找到这种格式化的完成位置。当我检查“仅启用我的代码”时,未捕获的异常立即表明这是问题所在。
    【解决方案2】:

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


    原答案

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

    【讨论】:

    • 用例是我的应用程序正在使用的变量的“监视窗口”。能够向用户显示应用程序中正在发生的事情的状态。所以它只发生在用户请求更新监视窗口时。在运行时它不是一个真正的问题,因为异常最终被捕获,但在开发过程中它是一个巨大的痛苦,因为它一直让我无法运行!
    • @Jason:是的,我看得出来这很痛苦。恐怕我不知道有什么办法。在大多数情况下,这可能是正确的行为。
    • 为什么这是正确的行为?如果我说抓住它,它不是被抓住了吗?
    • @Jason:问题在于您并没有像通常那样指定要捕获的异常类型。由于您正在使用反射,翻译层实际上对您隐藏。您不能明确针对调用者抛出的一种异常。
    • catch(Exception) 怎么不能捕获所有东西?
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多