Неуловимое исключение из MethodInfo.Invoke - PullRequest
0 голосов
/ 30 августа 2010

У меня есть этот код, который вызывает MethodInfo:

try
{
     registrator.Method.Invoke(instance, parameters);
}
catch{
    registrator.FailureType = RegistratorFailureType.ExceptionInRegistrator;
    //registrator.Exception = e;
}

Регистратор - это просто оболочка MethodInfo, свойство Method - это сам объект MethodInfo. параметрами является и object [], а instance - правильный экземпляр декларирующего типа метода (созданного с помощью Activator.Create).

Метод выглядит следующим образом (я тестировал исключение):

class Test : Plugin, ITest
{
    public void Register(IWindow window)
    {
        throw new Exception("Hooah");
    }
}

Проблема в том, что исключение никогда не перехватывается, и появляется всплывающее окно необработанного исключения Visual Studio.

Это в VS 2010 с .NET 4.0

Ответы [ 4 ]

1 голос
/ 30 августа 2010

В любом случае, проблема не в вашем коде.
В меню «Отладка / Исключения» удалите все проверки.
Это должно работать.

0 голосов
/ 30 августа 2010

Проблема не в коде, который вы показываете.

Я пробовал это:

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 является вашим брошенным исключением.

0 голосов
/ 30 августа 2010

Я думаю, проблема в том, что вы ожидаете определенный тип исключения, может быть 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;
    }
}
0 голосов
/ 30 августа 2010

Вы пробовали это?

В Program.cs

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

И попытка / отлов метода Run:

try
{
    Application.Run(new Form1());
}
    catch (Exception ex)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...