我有这个调用MethodInfo的代码:
try
{
registrator.Method.Invoke(instance, parameters);
}
catch{
registrator.FailureType = RegistratorFailureType.ExceptionInRegistrator;
//registrator.Exception = e;
}
Registrator只是一个MethodInfo包装器,Method属性是MethodInfo对象本身。参数是和object []和实例是Method的声明类型的正确实例(使用Activator.Create创建)。
方法看起来像这样(我正在测试异常捕获):
class Test : Plugin, ITest
{
public void Register(IWindow window)
{
throw new Exception("Hooah");
}
}
问题是:异常永远不会被捕获,并且会弹出Visual Studio未捕获的异常气泡。
这是在使用.NET 4.0的VS 2010中
答案 0 :(得分:1)
无论如何,问题不在您的代码中 在“调试/例外”菜单中,删除所有检查 它应该工作。
答案 1 :(得分:0)
你试过这个吗?
在Program.cs中
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Run方法的try / catch:
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
}
答案 2 :(得分:0)
问题不在于您展示的代码。
我试过了:
void Main()
{
Test instance = new Test();
object[] parameters = new object[] { null };
MethodInfo method = typeof(Test).GetMethod("Register");
try
{
method.Invoke(instance, parameters);
}
catch
{
Console.Out.WriteLine("Exception");
}
}
interface ITest { }
interface IWindow { }
class Plugin { }
class Test : Plugin, ITest
{
public void Register(IWindow window)
{
throw new Exception("Hooah");
}
}
按预期打印“例外”。您需要向我们展示更多代码。
如果我修改这样的代码:
catch(Exception ex)
{
Console.Out.WriteLine(ex.GetType().Name + ": " + ex.Message);
}
然后我得到一个TargetInvocationException,其中InnerException属性是抛出的异常。
答案 3 :(得分:0)
我认为问题在于您期望一种特定的异常类型,可能是IOException
或其他类型,但实际上MethodInfo.Invoke()
会抛出TargetInvocationException
:
try
{
registrator.Method.Invoke(instance, parameters);
}
catch (TargetInvocationException tie)
{
// replace IOException with the exception type you are expecting
if (tie.InnerException is IOException)
{
registrator.FailureType = RegistratorFailureType.ExceptionInRegistrator;
registrator.Exception = tie.InnerException;
}
else
{
// decide what you want to do with all other exceptions — maybe rethrow?
throw;
// or maybe unwrap and then throw?
throw tie.InnerException;
}
}