Не мог поймать исключение из Активатора. CreateInstance

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

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 насколько я могу сказать), код в блоке выгоды не выполнится. На самом деле выполнение просто остановится в Активаторе. CreateInstance-строка.

7
задан Patrik Hägne 10 May 2010 в 14:14
поделиться

2 ответа

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

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

4
ответ дан 7 December 2019 в 12:16
поделиться

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

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

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

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

1
ответ дан 7 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: