Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Reflection MethodInfo.Invoke()捕获方法内部的异常_C#_Exception_Reflection_Methods_Invoke - Fatal编程技术网

C# Reflection MethodInfo.Invoke()捕获方法内部的异常

C# Reflection MethodInfo.Invoke()捕获方法内部的异常,c#,exception,reflection,methods,invoke,C#,Exception,Reflection,Methods,Invoke,我调用了MethodInfo.Invoke(),通过反射执行函数。调用被包装在一个try/catch块中,但它仍然不会捕获我正在调用的函数引发的异常 我收到以下信息: 用户未处理异常 为什么MethodInfo.Invoke()会阻止在Invoke()之外捕获异常? 我如何绕过它 您如何尝试捕获异常?通常,对Invoke()的调用引发的是System.Reflection.targetingException的包装异常实例。您所关注的实际异常将出现在InnerException中 try {

我调用了
MethodInfo.Invoke()
,通过反射执行函数。调用被包装在一个
try/catch
块中,但它仍然不会捕获我正在调用的函数引发的异常

我收到以下信息:

用户未处理异常


为什么
MethodInfo.Invoke()
会阻止在
Invoke()
之外捕获异常?

我如何绕过它

您如何尝试捕获异常?通常,对
Invoke()
的调用引发的是
System.Reflection.targetingException
的包装异常实例。您所关注的实际异常将出现在
InnerException

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

编辑:据我所知,这个问题纯粹是IDE问题;您不喜欢VS将调用
MethodInfo
引发的异常视为未捕获,而它显然不是。您可以在这里阅读如何解决此问题:它似乎是一个bug/按设计;但不管怎样,答案中都列出了体面的解决办法

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

  • 您可以使用
    MethodInfo.Invoke
    ,捕获
    targetingException
    并检查其
    InnerException
    属性。您必须解决该答案中提到的IDE问题

  • 您可以从
    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();
        }
    }
    

    简短而简单的解决方案!我正面临着这个问题,在.NET5中,它根本不会抛出异常。我试过VS 2019 16.9.3和Rider 2020.3。方法中引发的异常是System.Net.Http异常。我是否应该在我的项目中添加必要的包,以便能够特别捕获该包?更新我的注释:调用的方法是异步任务方法,因此我必须使用wait(Task)方法调用它。Invoke(instance,null);