2009-10-17 25 views
40

Trong một ứng dụng winforms, trong sự kiện Load của một hình thức, thêm dòng sau:thất bại Im lặng trong C#, dường như ngoại lệ unhandled mà không sụp đổ chương trình

throw new Exception(); 

và chạy ứng dụng. Nó chạy mà không có vấn đề gì. Điều này được gọi là một sự im lặng thất bại, bạn có thể thử thêm các hộp thông báo trước và sau, và bạn sẽ sớm tìm ra rằng thay vì làm rơi ứng dụng, câu lệnh throw chỉ thoát khỏi sự kiện Load.

Tôi chắc chắn không cần giải thích mức độ nguy hiểm của điều này.

Tôi đã tự hỏi trong lý do (có thể là lịch sử) đằng sau hành vi đáng sợ này. Tôi chắc chắn đó không phải là quyết định thiết kế, có lẽ là không có lựa chọn hoặc lười biếng. Có ai biết không?

Sẽ rất vui nếu có ai đó có thể chỉ cho tôi danh sách các sự kiện có thể gây ra lỗi thất bại.

Dưới đây là một đoạn mã của tôi - Tôi không có ý tưởng làm thế nào nó có thể giúp đỡ - nhưng, ở đây nó là:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Form f = new Form(); 
      f.Load += new EventHandler((x, y) => { throw new Exception(); }); 
      Application.Run(f); 
     } 

    } 
} 

EDIT Có vẻ như nó không happend cho mọi người. Tôi sử dụng: fw 3.5, winforms, vs 2008, vista x64, dự án sạch mới của winforms, với mã được đề cập ở trên.

+1

Bạn có thể giải thích thêm về vấn đề của mình bằng một đoạn trích từ trình xử lý sự kiện OnLoad cho biểu mẫu của bạn không. Ngoài ra, bạn có trình xử lý UnhandledException trong miền ứng dụng này không? Nếu đây là hình thức chính của ứng dụng và nó không thể tải vì bạn đã ném một ngoại lệ chưa được giải quyết, bạn đã mong đợi điều gì xảy ra? Tôi nghi ngờ xử lý sự kiện unhandled của bạn sẽ được gọi trong trường hợp này. –

+0

Bạn đang sử dụng phiên bản cửa sổ nào? –

+3

Tôi thực sự đã bỏ phiếu cho câu hỏi trước của bạn xuống một lần nữa, nó được viết kém và kiêu ngạo ... – Blindy

Trả lời

46

Đây là một known problem on x64 systems:

Đây là một vấn đề được biết đến trên OS nền tảng 64-bit . Lý do là lõi hệ điều hành 64bit không cho phép chế độ người dùng ngoại lệ thông qua ngăn xếp chế độ kernal. Trường hợp ngoại lệ bị hệ điều hành nuốt . Điều đó xảy ra trong trình xử lý FormLoad , bởi vì nó được gọi trong hệ điều hành gọi lại. 32 bit hệ điều hành không làm điều này, vì vậy nó không repro ở đó.

Nhóm hệ điều hành đang điều tra các sự cố liên quan đến . Trong thời gian đó, bạn có để giải quyết vấn đề này. Bật "Dừng trên ngoại lệ cơ hội đầu tiên" sẽ làm cho trình gỡ lỗi dừng lại trong trường hợp này. Nhưng nó làm cho trình gỡ lỗi dừng lại thường xuyên, vì vậy bạn có thể chỉ muốn thực hiện việc này khi bạn tìm thấy sự cố.

Báo cáo lỗi được liên kết được cập nhật lần cuối vào tháng 2 năm 2008 và không cho biết điều gì đã xảy ra kể từ đó.

Tôi có thể tái tạo hành vi của hầu hết các poster trên hệ thống 32-bit của mình ở đây và tôi có thể tái tạo hành vi của OP trên máy tính 64-bit (Vista SP2, 3.5SP1 Framework).

+0

cảm ơn rất nhiều .. tôi một nửa nhớ điều này đã xảy ra với tôi cũng như với x86, nhưng tôi không chắc chắn đủ .. tôi sẽ kiểm tra xem nó ra. – Letterman

+1

Thật thú vị, ngoại lệ này không được nuốt trên máy tính Windows 7 x64 của tôi khi tôi chạy mà không gỡ lỗi, nhưng bị nuốt khi tôi làm. – FacticiusVir

+1

@FacticiusVir: Chính xác ở đây. Trên Win7 x64 của tôi nó chỉ bị nuốt khi tôi đang ở chế độ gỡ lỗi VS. – ulrichb

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