2010-05-10 35 views
7

OK, tôi thừa nhận rằng mã này sẽ trông lạ với bạn, và đó là vì nó là lạ. Đây chỉ là mã để tái tạo hành vi, không phải mã tôi muốn sử dụng.Không thể bắt ngoại lệ từ 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(); 
    } 
} 

Không có vấn đề gì loại ngoại lệ tôi cố gắng nắm bắt (ngoại lệ thực sự được ném là một ArgumentException theo như tôi có thể biết) mã bên trong khối catch sẽ không thực thi. Việc thực thi thực sự sẽ dừng lại ở dòng Activator.CreateInstance.

+0

Điều này chỉ xảy ra khi xây dựng đại biểu? Bạn phải sử dụng 'Delegate.CreateDelegate' cho điều đó. –

+0

Nó có thể chỉ xảy ra khi xây dựng các đại biểu nhưng mã thực tế nơi mà điều này được sử dụng là không biết loại nó đang cố gắng tạo ra, sửa chữa ngay bây giờ là nó là "cấm" để thậm chí thử nếu loại thừa hưởng từ Đại biểu. –

Trả lời

4

Bạn đã ném bom CLR với mã đó. Ấn tượng. Các rủi ro thực sự là tham nhũng của đống rác thu thập, nó được báo hiệu với một ExecutionEngineException. Rõ ràng thiệt hại là đủ rộng để ngăn chặn CLR thực hiện xử lý ngoại lệ.

Bạn có thể báo cáo điều này tại connect.microsoft.com. Tuy nhiên, lỗi được sửa trong .NET 4.0, nó tạo ra ngoại lệ thích hợp, ArgumentNullException, "Giá trị không thể là null, Parameter name: method". Cách giải quyết là rõ ràng, không vượt qua IntPtr.Zero khi nó mong đợi một chuỗi không null.

1

Khi tôi chạy mã này trong .NET 3.5 Tôi nhận được ExecutionEngineException. Khi thời gian chạy ném ngoại lệ này, nó tương tự như gọi Environment.FailFast. Rõ ràng đây là một triệu chứng của tham nhũng bộ nhớ trên heap.

Khi tôi chuyển mã ví dụ của bạn về sau, hành vi đúng được thực hiện.

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

Tôi cũng biết rằng điều này sẽ trả về câu hỏi hơn câu trả lời ... :)

+0

Tôi không thể nắm bắt được ngoại lệ và kiểm tra nó ở tất cả, các thiết lập của bạn để đạt được điều này là gì? –

+0

@Patrik - Bạn đang chạy phiên bản .NET nào? – ChaosPandion

+0

3.5 sử dụng VS 2008. –

Các vấn đề liên quan