【发布时间】: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方法的MethodInfo,Invoke就可以了。 -
但我明白你的意思。实际上,在我之前的评论中,我的 Foo
TargetInvocationException将被包装为反射抛出的 TIE 的内部异常。所以,是的,可能没有意义,只是一种安全代码风格。 -
那个程序员永远不会后悔的。这种过度谨慎在 .NET Framework 中并不少见,它至少避免了一次支持调用 :) 如果 TargetInvocationException 构造函数永远不允许空参数但没有发生,他的生活会更轻松。让异常构造函数本身抛出异常是相当残酷的。
标签: c# .net reflection system.componentmodel targetinvocationexception