我调用了MethodInfo.Invoke()
来通过反射执行函数。调用被包装在一个try/catch
块中,但它仍然不能捕获由我正在调用的函数抛出的异常。
我收到以下消息:
用户未处理
异常。
为什么MethodInfo.Invoke()
要防止异常在Invoke()
之外被捕获
我如何绕过它?
发布于 2010-11-07 19:10:10
编辑:我理解你的问题,这个问题纯粹是一个集成开发环境的问题;你不喜欢VS把调用MethodInfo
抛出的异常当作未捕获的异常,而它显然不是。你可以在这里阅读关于如何解决这个问题的文章:Why is TargetInvocationException treated as uncaught by the IDE?它看起来像是一个bug /被设计出来;但无论如何,答案中都列出了一些不错的解决方法。
在我看来,您有几个选择:
MethodInfo.Invoke
,捕获TargetInvocationException
并检查其InnerException
属性。你必须解决这个答案中提到的集成开发环境的问题。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();
}
}
发布于 2010-11-07 18:49:39
您是如何尝试捕获异常的?通常,从调用Invoke()
抛出的是System.Reflection.TargetInvocationException
的包装异常实例。您要寻找的实际异常将在InnerException
中。
try
{
method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
ex = ex.InnerException; // ex now stores the original exception
}
https://stackoverflow.com/questions/4117228
复制相似问题