【问题标题】:Can a TargetInvocationException thrown from reflection have a null InnerException从反射抛出的 TargetInvocationException 是否有 null InnerException
【发布时间】:2016-09-12 11:49:25
【问题描述】:

在浏览System.ComponentModel.DataAnnotations.CustomValidationAttributehere的源代码时,我看到了以下代码(缩短):

try
{
    methodInfo.Invoke(null, methodParams);
}
catch (TargetInvocationException ex)
{
    if (ex.InnerException != null)
    {
        throw ex.InnerException
    }
    throw;
}

这里,代码检查ex.InnerException 是否为空。 我不认为如果 TargetInvocationException 是从反射调用中抛出的,那么 null InnerException 永远不会有。

这可能吗?如果是这样,请提供InnerException 可以为空的场景。

【问题讨论】:

  • void Foo() { throw new TargetInvocationException(null); } 怎么样。关键是,TargetInvocationException 可能不会从反射中抛出,而是从用户代码中抛出 - 它是公共类,具有不需要非 null 内部异常的公共构造函数。
  • @IvanStoev 谢谢 - 我特别要求从反射中抛出一个 TIE,但是
  • 为什么你认为它应该来自反射?通过反射获取我的Foo 方法的MethodInfoInvoke 就可以了。
  • 但我明白你的意思。实际上,在我之前的评论中,我的 Foo TargetInvocationException 将被包装为反射抛出的 TIE 的内部异常。所以,是的,可能没有意义,只是一种安全代码风格。
  • 那个程序员永远不会后悔的。这种过度谨慎在 .NET Framework 中并不少见,它至少避免了一次支持调用 :) 如果 TargetInvocationException 构造函数永远不允许空参数但没有发生,他的生活会更轻松。让异常构造函数本身抛出异常是相当残酷的。

标签: c# .net reflection system.componentmodel targetinvocationexception


【解决方案1】:

MSDN 声明

创建时,TargetInvocationException 被传递一个对通过反射调用的方法抛出的异常的引用。 InnerException 属性包含基础异常。

所以理论上只使用框架反射方法它不应该为空......理论上:P

当然,如果您从被调用的方法中显式抛出它,它可以(并且将会!)为 null。

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多