无法从Activator.CreateInstance中捕获异常

时间:2010-05-10 14:14:18

标签: c# .net exception-handling activator

好的,我承认这段代码看起来很奇怪,那是因为很奇怪。这只是重现行为的代码,而不是我想要使用的代码。

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 个答案:

答案 0 :(得分:4)

你用该代码轰炸了CLR。令人印象深刻。实际的不幸事件是垃圾收集堆的损坏,它用ExecutionEngineException发出信号。显然,损坏足以阻止CLR执行异常处理程序。

您可以在connect.microsoft.com上报告此问题。但是,该错误在.NET 4.0中得到修复,它会生成正确的异常,ArgumentNullException,“Value不能为null,参数名称:方​​法”。解决方法很明显,当它需要非空字符串时,不要传递IntPtr.Zero。

答案 1 :(得分:1)

当我在.NET 3.5中运行此代码时,我得到ExecutionEngineException。当运行时抛出此异常时,它类似于调用Environment.FailFast。显然,这是堆上内存损坏的症状。

当我将示例代码切换到以下内容时,会实现正确的行为。

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

我很清楚这会带来更多问题而不是答案......:)