2010-07-09 40 views
13

Đây có phải là lỗi trong Winforms không? (Thử nghiệm trên cả VS2008 và VS2010)Tại sao tải biểu mẫu không thể bắt ngoại lệ?

private void Form1_Load(object sender, EventArgs e) 
{ 
    throw new Exception("Hey");    
} 

tôi không nhận được bất kỳ lỗi trong mã đó, một thời gian trước, tôi đang cố gắng để xây dựng một giải pháp cho vấn đề này Parse a number from a string with non-digits in between

Và tôi làm mã này trong Form1_Load:

private void Form1_Load(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

Tôi tự hỏi tại sao nó không hiển thị số. Sau đó, trên di chuyển mã để button1_Click ...

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

... sau đó tôi nhận thấy rằng có một lỗi: chuỗi đầu vào không phải là trong một định dạng chính xác.

Tại sao Form1_Load không phát hiện bất kỳ ngoại lệ nào, tại sao nó lại không thành công? Mã chỉ cần thoát ra khỏi form1_load tại chuỗi t = s.ToCharArray() TakeWhile ...

+1

Tôi đã sửa thành công hành vi này trên máy phát triển Win7 SP1 x64 của mình. Xem [câu trả lời này] (http://stackoverflow.com/a/11997142/119527) để biết cách thực hiện. –

Trả lời

21

Viết lại, tôi đã tìm ra nó xuất phát từ đâu. Windows hoạt động sai khi một ngoại lệ được nâng lên trong quy trình 32 bit khi nó chạy trên phiên bản 64 bit của Windows 7. Nó nuốt bất kỳ ngoại lệ nào được đưa ra bởi mã chạy để đáp ứng với thông điệp Windows được kích hoạt bởi trình quản lý cửa sổ 64 bit . Giống như WM_SHOWWINDOW, thông báo làm cho sự kiện Load được nâng lên.

Trình gỡ lỗi đóng vai trò vì khi nó đang hoạt động, bẫy ngoại lệ thông thường trong ứng dụng Winforms bị tắt để cho phép trình gỡ lỗi dừng lại trên ngoại lệ. Điều đó không xảy ra trong trường hợp này vì Windows 7 nuốt ngoại lệ đầu tiên, ngăn không cho trình gỡ lỗi nhìn thấy nó.

Tôi đã viết về vấn đề này rộng rãi hơn trong this answer, cùng với cách giải quyết có thể xảy ra.

+0

có vẻ như là một lỗi. trong khi bên trong VS nó không âm thầm, nó không bắt bất kỳ ngoại lệ. nếu chạy độc lập, nó có thể bắt được ngoại lệ – Hao

-1

Các lớp khung WinForms sẽ không tự động bắt bất kỳ ngoại lệ nào cho bạn. Đó không phải là một lỗi, đó là do thiết kế - họ sẽ làm gì với ngoại lệ?

Bạn phải có khối try/catch của riêng mình trong bất kỳ sự kiện nào hoặc xử lý sự kiện Application.ThreadException. Sự kiện đó có thể hữu ích cho một số mã xử lý chung như đăng nhập ngoại lệ hoặc hiển thị hộp thoại báo lỗi, nhưng rõ ràng nó không thể làm bất kỳ điều gì cụ thể cho bất kỳ sự kiện riêng lẻ hoặc loại ngoại lệ nào.

+0

cố gắng thực thi mã của tôi ở trên. Ngược lại hành vi của ** ném ngoại lệ mới ("Hey Yo!") ** trong Form1_Load và khi nó ở trong button1_Click – Hao

5

Xem nội dung này: The case of the disappearing OnLoad exception. Đó là do thiết kế (mặc dù thiết kế cực kỳ ngu ngốc, IMO). Ngoại lệ của bạn là nhấn một ranh giới chế độ hạt nhân trong thư giãn của ngăn xếp. Nếu bạn có thể, chuyển sang một số sự kiện khác hoặc không cho phép ngoại lệ thoát; điều này không giúp ích nếu bạn đang mong đợi trình gỡ rối tự động ngắt một ngoại lệ chưa được xử lý trong OnLoad.

Nếu bạn quan tâm, tôi đã viết thêm một chút in this answer.

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