Исключения не распространяются из отраженного вызова метода в C # - PullRequest
8 голосов
/ 07 ноября 2011

При вызове метода через methodInfo.Invoke, если генерируется исключение, оно, похоже, не распространяется до моих блоков catch.

object value;
try
{
    value = myMethod.Invoke(null, parameters);//program crashes with uncaught exception
}
catch
{
    throw new Exception("Caught!");//never executed
}

Особое исключение, вызываемое этим методом, - это KeyNotFoundException, но это не должно иметь значения, потому что я ловлю все верно?

Конкретное сообщение об ошибке, которое я получаю от Visual Studio:

KeyNotFoundException was unhandled by user code

тогда как обычно в сообщении будет указано

KeyNotFoundException was unhandled

если вызов не был отраженным вызовом.

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

Ответы [ 3 ]

3 голосов
/ 08 ноября 2011

у меня работает:

using System;
using System.Reflection;

class Program
{
    static void Main(string[] args)  
    {
        var method = typeof(Program).GetMethod("ThrowException");
        try
        {
            method.Invoke(null, null);
        }
        catch (TargetInvocationException e)
        {
            Console.WriteLine("Caught exception: {0}", e.InnerException);
        }
    }

    public static void ThrowException()
    {
        throw new Exception("Bang!");
    }
}

Обратите внимание, что вам нужно перехватить TargetInvocationException, что является исключением, генерируемым непосредственно Method.Invoke, оборачивая исключение, генерируемое самим методом.

Можете ли вы придумать подобную короткую, но полную программу, которая демонстрирует проблему?

3 голосов
/ 08 ноября 2011

Это также может быть проблемой с отладчиком Visual Studio. Как отмечено в принятом ответе на этот похожий вопрос здесь , есть несколько обходных путей, которые вы можете сделать. Самым простым из которых является изменение отладчика Visual Studio, чтобы отключить «Просто мой код» в Сервис -> Параметры -> Отладка -> Общие. Вы также можете заключить его в делегат или явно попытаться перехватить исключение при вызове и проверить внутреннее исключение, которое должно быть вашим KeyNotFoundException.

1 голос
/ 07 ноября 2011

Если ошибка возникает во время вызова метода с отражением, он должен выбросить TargetInvocationException, который оборачивает (через .InnerException) оригинал.Однако есть несколько методов, которые могут вызвать сбой большего количества терминалов, например несколько методов создания winform / цикла сообщений.

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

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