Csharp/C#教程:Reflection MethodInfo.Invoke()从方法内部捕获exception分享


Reflection MethodInfo.Invoke()从方法内部捕获exception

我调用了MethodInfo.Invoke()来通过reflection执行一个函数。 调用包装在try/catch块中,但它仍然不会捕获我正在调用的函数抛出的exception。

我收到以下消息:

用户未处理exception。

为什么MethodInfo.Invoke()阻止在Invoke()之外捕获exception?
我该如何绕过它?

编辑:据我了解你的问题,问题纯粹是一个IDE; 你不喜欢VS将MethodInfo调用抛出的exception视为未捕获,当它显然不是时。 您可以在此处阅读有关如何解决此问题的信息: 为什么IDE会将TargetInvocationException视为未捕获? 它似乎是一个错误/设计; 但不管怎样,这个答案中列出了体面的解决方法。

在我看来,你有几个选择:

  1. 您可以使用MethodInfo.Invoke ,捕获TargetInvocationException并检查其InnerException属性。 您将不得不解决该问题中提到的IDE问题。

  2. 您可以从MethodInfo创建一个适当的Delegate ,然后调用它。 使用此技术,抛出的exception将不会被包装。 此外,这种方法似乎与调试器很好地配合; 我没有得到任何“未捕获的exception”弹出窗口。

这是一个突出两种方法的例子:

 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(); } } 

你是如何捕捉exception的? 通常, Invoke()抛出的是System.Reflection.TargetInvocationException的包装exception实例。 您之后的实际exception将在InnerException

上述就是C#学习教程:Reflection MethodInfo.Invoke()从方法内部捕获exception分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 try { method.Invoke(target, params); } catch (TargetInvocationException ex) { ex = ex.InnerException; // ex now stores the original exception } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1290552.html

(0)
上一篇 2022年11月29日
下一篇 2022年11月29日

精彩推荐