2010-05-10 148 views
7

好吧,我承认这个代码对你来说看起来很奇怪,那是因为这很奇怪。这只是重现行为的代码,而不是我想要使用的代码。无法捕捉异常来自Activator.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据我可以告诉)catch块不会执行里面的代码。实际上执行只会停在Activator.CreateInstance行。

+0

只有在构造代表时才会发生这种情况吗?你应该为此使用'Delegate.CreateDelegate'。 – 2010-05-10 14:44:08

+0

它可能只在构造委托时发生,但实际使用的代码并不知道它试图创建什么类型,现在的修正是如果类型继承自委派,那么即使尝试也是“禁止”。 – 2010-05-10 14:50:47

回答

4

你轰炸与代码的CLR。令人印象深刻。实际的事故是垃圾收集堆的腐败,它用ExecutionEngineException表示。显然,这种损害足以阻止CLR执行异常处理程序。

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

1

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

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

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

我深知这带来了问题多于答案... :)

+0

我无法捕捉到异常,并检查它,你有什么设置来达到这个目的? – 2010-05-10 14:49:03

+0

@Patrik - 你运行的是什么版本的.NET? – ChaosPandion 2010-05-10 14:53:39

+0

3.5使用VS 2008. – 2010-05-10 14:55:06