【发布时间】:2011-05-06 06:11:11
【问题描述】:
我调用了MethodInfo.Invoke() 以通过反射执行函数。该调用包含在 try/catch 块中,但它仍然无法捕获我正在调用的函数引发的异常。
我收到以下消息:
用户未处理异常。
为什么MethodInfo.Invoke() 会阻止在Invoke() 之外捕获异常?
我该如何绕过它?
【问题讨论】:
标签: c# exception reflection methods invoke
我调用了MethodInfo.Invoke() 以通过反射执行函数。该调用包含在 try/catch 块中,但它仍然无法捕获我正在调用的函数引发的异常。
我收到以下消息:
用户未处理异常。
为什么MethodInfo.Invoke() 会阻止在Invoke() 之外捕获异常?
我该如何绕过它?
【问题讨论】:
标签: c# exception reflection methods invoke
您如何尝试捕获异常?通常,调用Invoke() 时抛出的是System.Reflection.TargetInvocationException 的包装异常实例。您所追求的实际异常将在 InnerException 中。
try
{
method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
ex = ex.InnerException; // ex now stores the original exception
}
【讨论】:
编辑:据我了解,问题纯粹是 IDE 问题;您不喜欢 VS 将调用 MethodInfo 引发的异常视为未捕获,而显然不是。您可以在此处阅读有关如何解决此问题的信息:Why is TargetInvocationException treated as uncaught by the IDE? 这似乎是一个错误/设计使然;但是该答案中列出了一种或另一种体面的解决方法。
在我看来,您有两种选择:
您可以使用MethodInfo.Invoke,捕获TargetInvocationException 并检查其InnerException 属性。您将不得不解决该答案中提到的 IDE 问题。
您可以从MethodInfo 创建一个适当的Delegate 并调用它。使用这种技术,抛出的异常将不会被包装。此外,这种方法确实似乎与调试器配合得很好;我没有收到任何“未捕获的异常”弹出窗口。
这是一个突出两种方法的示例:
class Program
{
static void Main()
{
DelegateApproach();
MethodInfoApproach();
}
static void DelegateApproach()
{
try
{
Action action = (Action)Delegate.CreateDelegate
(typeof(Action), GetMethodInfo());
action();
}
catch (NotImplementedException nie)
{
}
}
static void MethodInfoApproach()
{
try
{
GetMethodInfo().Invoke(null, new object[0]);
}
catch (TargetInvocationException tie)
{
if (tie.InnerException is NotImplementedException)
{
}
}
}
static MethodInfo GetMethodInfo()
{
return typeof(Program)
.GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Static);
}
static void TestMethod()
{
throw new NotImplementedException();
}
}
【讨论】: