2010-05-10 132 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