2013-06-04 26 views
11

tôi có đoạn mã sau:Dừng visual studio từ vi phạm về ngoại lệ trong Task

Task load = Task.Factory.StartNew(() => {//Some Stuff Which Throws an Exception}); 

try 
{ 
    load.Wait(); 
} 
catch (AggregateException ex) 
{ 
    MessageBox.Show("Error!"); 
} 

Khi bao giờ một ngoại lệ được ném trong Task, tôi muốn nó bong bóng lên bị bắt trong catch thay vì thị giác studio phá vỡ tại điểm ngoại lệ được gây ra.

I Tried google và một số đề nghị tôi thêm [DebuggerHidden] này trên phương pháp của tôi, nhưng nó không hoạt động

+0

Ồ, người đàn ông, điều này khiến tôi bối rối. Tôi nghĩ rằng ngoại lệ của tôi đã không bị bắt ở tất cả, nhưng thay vì phá vỡ tự động chỉ là quá sớm và có thể được tiếp tục từ. Thực sự có vẻ giống như một hành vi mặc định rất xấu. Thông báo lỗi có vẻ sai lầm một cách mù quáng, vì nó tuyên bố ngoại lệ là không bị bắt nhưng việc tiếp tục sẽ khiến nó bị bắt hoàn toàn tốt đẹp. – Kat

Trả lời

22

Ok tôi đã tìm hiểu cách thực hiện. Câu trả lời là đúng here trong phần ghi chú

Khi "Just My Code" được kích hoạt, Visual Studio trong một số trường hợp sẽ phá vỡ trên dòng ném ngoại lệ và hiển thị một thông báo lỗi nói rằng "ngoại lệ không được xử lý bởi Mã người dùng." Lỗi này là lành tính. Bạn có thể nhấn F5 để tiếp tục và xem hành vi xử lý ngoại lệ được thể hiện trong các ví dụ này. Để ngăn Visual Studio phá vỡ lỗi đầu tiên, chỉ cần bỏ chọn hộp kiểm Bật Chỉ số của tôi trong Công cụ, Tùy chọn, Gỡ lỗi, Chung.

0

Để tắt dừng trên ngoại lệ nhấn "Ctrl + Alt + E". Thao tác này sẽ mở cửa sổ Ngoại lệ. Untick "Ngoại ngữ phổ biến thời gian chạy ngoại lệ - Thrown".

+1

Điều đó sẽ ngăn không cho nó tạm dừng từ bên trong đại biểu, nhưng không phải khi nó được gọi lại trên 'Chờ đợi'. – Servy

6

Từ quan điểm của VS có thực sự không có bất kỳ khác nhau giữa các ngoại lệ được ném từ trong một đại biểu vượt qua một nhiệm vụ từ bất kỳ ngoại lệ khác.

Không có cách nào để giải quyết vấn đề này trong trường hợp chung.

Tuy nhiên, một điều bạn có thể làm là tận dụng thực tế là khi ngoại lệ được ném lại, nó được bao bọc trong một AggregateException. Bạn có thể phá vỡ khi AggregateException bị ném nhưng không thể xảy ra ngoại lệ khác.

Bạn có thể vào Debug -> Exceptions, bỏ chọn tất cả các trường hợp ngoại lệ CLR, nhưng sau đó kích hoạt lại ngoại lệ cốt liệu:

enter image description here

Nó bây giờ sẽ không dừng lại trong cơ thể Task nhưng sẽ tạm dừng các chương trình gỡ rối khi bạn gọi Wait.

Tác dụng phụ không may là bây giờ bạn sẽ không còn tạm dừng cho bất kỳ trường hợp ngoại lệ nào khác trong chương trình của bạn, ngay cả khi họ không ở trong một đại biểu được chuyển đến Task.

+0

Ồ, điều đó thật đáng tiếc nhưng lại bị bệnh. Cảm ơn câu trả lời của bạn! – Krimson

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