MethodInfo.Invoke () подавляет исключение - PullRequest
2 голосов
/ 28 июня 2019

Я использую отражение, чтобы вызвать метод, который выбрасывает исключение.Но это исключение не выдается, я могу его поймать.
Я вызываю, вызывая:

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) 
}

Так чтоожидаемый результат должен быть:

Ошибка

, но

все в порядке

Ответы [ 2 ]

4 голосов
/ 28 июня 2019

Ваш метод возвращает Task, поэтому фактически не выдает исключение. Чтобы получить исключение, вы должны сначала развернуть задачу:

var result = GetMethod().Invoke(myInstance, new object[] { result });
if (result is Task task)
{
    // this line will throw.
    await task;
}
3 голосов
/ 28 июня 2019

MyMethod не выдает исключение.Он возвращает Task, который в конечном итоге будет в неисправном состоянии.Вы можете получить доступ к членам этой задачи (когда она выполнена), чтобы увидеть, что это привело к исключению, но вызов MyMethod приведет к никогда , вызовет исключение, потому что это метод async. только когда-либо вернет Task в том или ином состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...