Не удалось поймать исключение из Activator.CreateInstance - PullRequest
7 голосов
/ 10 мая 2010

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

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero });
        }
        catch
        {
            Console.WriteLine("This won't print!");
        }

        Console.Write("Actually this will not print either!");
        Console.ReadLine();
    }
}

Независимо от того, какой тип исключения я пытаюсь перехватить (насколько я могу судить, фактически выброшенное исключение является ArgumentException), код внутри блока catch не будет выполнен. На самом деле выполнение просто остановится на линии Activator.CreateInstance.

Ответы [ 2 ]

4 голосов
/ 10 мая 2010

Вы взорвали CLR с этим кодом. Впечатляет. Фактическим неудачей является повреждение кучи, собранной мусором, о которой сообщается с помощью исключения ExecutionEngineException. По-видимому, ущерб достаточно велик, чтобы не допустить выполнения обработчиком исключений CLR.

Вы можете сообщить об этом на connect.microsoft.com. Тем не менее, ошибка исправлена ​​в .NET 4.0, она генерирует правильное исключение, ArgumentNullException, «Значение не может быть нулевым, Имя параметра: метод». Обходной путь очевиден, не передавайте IntPtr.Zero, когда он ожидает ненулевую строку.

1 голос
/ 10 мая 2010

Когда я запускаю этот код в .NET 3.5, я получаю ExecutionEngineException. Когда среда выполнения выдает это исключение, это похоже на вызов Environment.FailFast. По-видимому, это является признаком повреждения памяти в куче.

Когда я переключаю ваш пример кода на следующее, достигается правильное поведение.

Activator.CreateInstance(
    typeof(Func<int>), 
    new object[] { IntPtr.Zero, new object() }
);

Мне хорошо известно, что это вызывает больше вопросов, чем ответов ...:)

...