Rod*_*iko 27 c# reflection methods exception invoke
我有一个MethodInfo.Invoke()通过反射执行函数的调用.调用包含在一个try/catch块中,但它仍然不会捕获我正在调用的函数抛出的异常.
我收到以下消息:
用户未处理异常.
为什么要MethodInfo.Invoke()阻止异常被捕获Invoke()?
我该如何绕过它?
Ani*_*Ani 29
编辑:据我了解你的问题,问题纯粹是一个IDE; 你不喜欢VS处理MethodInfo由于未被捕获而引发的异常,当它显然不是时.您可以在此处阅读有关如何解决此问题的信息:为什么IDE会将TargetInvocationException视为未捕获?它似乎是一个错误/设计; 但不管怎样,在答案中列出了体面的解决方法.
在我看来,你有几个选择:
您可以使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
Qui*_*ith 20
你是如何抓住异常的呢?通常,从调用中抛出的Invoke()是包装异常实例System.Reflection.TargetInvocationException.你所追求的实际例外将在InnerException.
try
{
method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
ex = ex.InnerException; // ex now stores the original exception
}
Run Code Online (Sandbox Code Playgroud)