[英]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.