我有一个呼叫MethodInfo.Invoke()
通过反射来执行功能。 该呼叫被包裹在一个try/catch
块,但它仍然不会赶上由我调用该函数抛出的异常。
我收到以下消息:
例外的是由用户未处理。
为什么MethodInfo.Invoke()
防止异常被抓住了外部Invoke()
如何绕过它?
我有一个呼叫MethodInfo.Invoke()
通过反射来执行功能。 该呼叫被包裹在一个try/catch
块,但它仍然不会赶上由我调用该函数抛出的异常。
我收到以下消息:
例外的是由用户未处理。
为什么MethodInfo.Invoke()
防止异常被抓住了外部Invoke()
如何绕过它?
编辑:据我了解您的问题,这个问题是纯粹的IDE之一; 你不喜欢VS治疗用的调用抛出的异常MethodInfo
为未捕获的,当它显然不是。 您可以了解如何在这里解决这个问题: 为什么TargetInvocationException由IDE视为未捕获的? 这似乎是设计中的错误/; 但这种或那种方式,体面的解决办法中列出了这个问题的答案。
在我看来,你有两个选择:
您可以使用MethodInfo.Invoke
,赶上TargetInvocationException
并检查其InnerException
属性。 你将不得不在该答复中提到要解决IDE的问题。
您可以创建一个适当的Delegate
出的MethodInfo
,并调用该网址。 利用这种技术,抛出的异常不会被包装。 此外,这种做法似乎与调试发挥很好; 我没有得到任何“未捕获的异常”弹出窗口。
下面是突出了这两种方法的例子:
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();
}
}
你是如何试图捕获异常? 通常,什么是从呼叫抛给Invoke()
是一个包装异常实例System.Reflection.TargetInvocationException
。 你后实际的异常将在InnerException
。
try
{
method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
ex = ex.InnerException; // ex now stores the original exception
}