Получение правильного типа исключения из вызова Invoke (отражение) - PullRequest
0 голосов
/ 18 июля 2011

В нашем интеграционном проекте мы динамически делегируем серию конкретных объектов Processor, используя Reflection.

var genericType = typeof(IMessageProcessor<>).MakeGenericType(parseResponse.DomainMessage.GetType());

var miProcessMessage = genericType.GetMethod("ProcessMessage");
miProcessMessage.Invoke(processor, new object[] { parseResponse.DomainMessage });

Теперь, в определенных ситуациях, одному из процессоров нужно выдать определенное исключение, в этом случае, когда он не находит файл в ожидаемом месте.

throw new ResourceNotFoundException(string.Format("Could not find file {0}", filePath));

Наш процессор хочет проверить это исключение, чтобы определить, нужно ли повторить или прервать обработку (на основе механизма, основанного на времени, который здесь не актуален).

catch(ResourceNotFoundException ex)
{
   // do stuff
}

Проблема заключается в том, что вызов, очевидно, «проглатывает» конкретное ResourceNotFoundException и сбрасывает System.Exception, говоря «Исключение было сгенерировано целью вызова».

Есть ли какой-нибудь способ сохранить тот факт, что с помощью Reflection фактически было выдано ResourceNotFoundException, а не исключение?

1 Ответ

1 голос
/ 18 июля 2011

MethodBase.Invoke(Object, Object[]) переносит любое исключение, выброшенное вызванным методом, в TargetInvocationException.Вы можете получить доступ к внутреннему исключению и либо обработать его напрямую, либо перебросить его для дальнейшей обработки в стеке, как в следующем примере:

var genericType = typeof(IMessageProcessor<>).MakeGenericType(parseResponse.DomainMessage.GetType());
var miProcessMessage = genericType.GetMethod("ProcessMessage");
try {
    miProcessMessage.Invoke(processor, new object[] { parseResponse.DomainMessage });
catch (TargetInvocationException ex)
{
    throw ex.InnerException;
}

Обратите внимание, что это заменит трассировку стека внутреннего исключения.(Технически неподдерживаемый) способ сохранения трассировки стека описан в этом ответе на SO .

...