2012-04-17 37 views
9

Tôi đã gặp phải tình huống như vậy. Ứng dụng WinForms có hai biểu mẫu. Các hình thức chính có một nút, khi người dùng nhấp vào nó, hộp thoại phương thức được hiển thị. Biểu mẫu hộp thoại cũng có một nút, khi người dùng nhấp vào nó, ngoại lệ được ném.Hành vi xử lý ngoại lệ trong ứng dụng WinForms, sử dụng hộp thoại phương thức

Xử lý ngoại lệ khác, khi ứng dụng chạy dưới trình gỡ rối và tự chạy. Đây là mã tối thiểu, tái tạo hành vi này:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      using (var dialog = new Form2()) 
      { 
       dialog.ShowDialog(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Oops! " + ex.Message); 
     } 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Khi gỡ lỗi, nâng cao một ngoại lệ đóng hộp thoại, và xử lý ngoại lệ trong Form1.button1_Click xử lý ngoại lệ.

Khi tự chạy ứng dụng, hãy tăng ngoại lệ không đóng hộp thoại. Thay vào đó, trình xử lý Application.ThreadException mặc định được gọi.

Tại sao (và điều gì làm) hành vi khác nhau? Làm thế nào để mang nó phù hợp với nhau?

Trả lời

8

Hãy thử điều này trong Program.Main của bạn():

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
    Application.Run(new Form1()); 
} 

Lý do là để làm với cách Windows Forms bộ phận nhỏ được chạy bên ngoài của quá trình Visual Studio Hosting. Xem này:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

Nếu bạn đặt những dòng trên mã để:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

Và chạy nó trong VS, bạn sẽ thấy những gì các hành vi mặc định là - hộp thoại mà bạn tham khảo sẽ được hiển thị, một khi bạn bước qua ngoại lệ ban đầu trong mã. Mặc định chỉ đơn giản là khác nhau tùy thuộc vào việc bạn chạy ở chế độ được lưu trữ hay độc lập.

Vâng, "Tại sao" là loại được đề cập trong liên kết MS - lỗi xảy ra trong trình xử lý sự kiện, trên một chuỗi khác. Hành vi mặc định là xử lý điều này theo cách khác, chỉ trong WinForms. Nếu bạn đặt dòng này sau khi cuộc gọi của bạn vào hộp thoại:

throw new Exception("Bah!"); 

Và giữ hành vi trên CatchException bạn sẽ thấy rằng nó đi để xử lý ngoại lệ của bạn như bạn mong đợi. Nó chỉ là ngoại lệ trong trình xử lý sự kiện được xử lý khác nhau. Hy vọng rằng sẽ giúp.

+0

cảm ơn! Đây là một câu trả lời về "làm thế nào để" một phần của câu hỏi của tôi. "Tại sao và cái gì cho" vẫn là thực tế ... – Dennis

+2

Đã hiểu; Tại sao/Điều gì cho tôi sẽ đặt xuống đây chỉ là một trong những quirks của khuôn khổ .NET. Tôi có thể đứng sửa chữa, và tôi muốn được quan tâm để biết nếu có ai biết một lý do chính đáng tại sao hành vi này là khác nhau tùy thuộc vào bối cảnh trong đó các ứng dụng đang chạy. Tôi đồng ý rằng đó là một chút của một gotcha. –

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