繁体   English   中英

MethodInfo.Invoke() 抑制异常

[英]MethodInfo.Invoke() suppresses Exception

我正在使用反射来调用一个抛出异常的方法。 但是这个异常并没有被抛出,neigter我可以捕捉到它。
我通过调用调用:

GetMethod().Invoke(myInstance, new object[] { result });

结果的类型为 Object。被调用的方法抛出如下异常:

public async Task MyMethod(Object input)
    {
        // do something...
        throw new Exception("Error");

    }

如果我不使用 try-catch 块,应用程序将继续运行,就像我使用这样的一样:

try
{
    GetMethod().Invoke(myInstance, new object[] { result });
    log("everything is ok");
}
catch(Exception e)
{
    log(e.message) 
}

所以预期的 output 应该是:

错误

但是

一切都好

您的方法返回一个Task ,因此实际上不会抛出异常。 为了获得异常,您应该首先解开任务:

var result = GetMethod().Invoke(myInstance, new object[] { result });
if (result is Task task)
{
    // this line will throw.
    await task;
}

MyMethod 不会抛出异常。 它返回一个最终将处于故障状态的Task 您可以访问该任务的成员(当它完成时)以查看它是否导致异常,但调用MyMethod永远不会抛出异常,因为它是async方法。 只会在一个或另一个州返回一个Task

我遇到了这个问题并且我这样做了 100%,尝试将结果作为动态结果并检查异常,如下所示:-

dynamic res = GetMethod().Invoke(myInstance, new object[] { result });
            if (res.Exception != null)
            {
                throw res.Exception;
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM