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,然后开始。但我明白你的意思。实际上,在我前面的评论中,我的FooTargetInvocationException
将被包装为反射抛出的TIE的内部异常。所以,是的,可能没有意义,只是一种安全代码风格。那个程序员永远不会后悔。这种过度的谨慎在.NET Framework中并不少见,它至少避免了一次支持调用:)如果TargetInvocationException构造函数永远不允许空参数,他的生活会更轻松,但这并没有发生。让异常构造函数本身抛出异常是相当残酷的。
try
{
methodInfo.Invoke(null, methodParams);
}
catch (TargetInvocationException ex)
{
if (ex.InnerException != null)
{
throw ex.InnerException
}
throw;
}