Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从反射引发的TargetInvocationException是否可以具有null InnerException_C#_.net_Reflection_System.componentmodel_Targetinvocationexception - Fatal编程技术网

C# 从反射引发的TargetInvocationException是否可以具有null InnerException

C# 从反射引发的TargetInvocationException是否可以具有null InnerException,c#,.net,reflection,system.componentmodel,targetinvocationexception,C#,.net,Reflection,System.componentmodel,Targetinvocationexception,在浏览System.ComponentModel.DataAnnotations.CustomValidationAttribute的源代码时,我看到了以下代码(简称): 这里,代码检查ex.InnerException是否为空。 我认为如果从反射调用中抛出targetingException,则nullInnerException 这可能吗?如果是这样,请提供一个InnerException可以为空的场景。以下状态 创建时,TargetInvocationException会传递一个对通过反射

在浏览
System.ComponentModel.DataAnnotations.CustomValidationAttribute
的源代码时,我看到了以下代码(简称):

这里,代码检查
ex.InnerException
是否为空。 我认为如果从反射调用中抛出
targetingException
,则
null
InnerException

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

以下状态

创建时,TargetInvocationException会传递一个对通过反射调用的方法引发的异常的引用。InnerException属性保存基础异常

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


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

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