2013-02-20 39 views
6

Tôi đã nghiên cứu this article on MSDN, cũng như một số câu hỏi/câu trả lời về SO liên quan đến chủ đề này, nhưng không thể hiểu tại sao mã bên dưới không hoạt động (trong ứng dụng bảng điều khiển mẫu).Làm cách nào để xử lý các ngoại lệ trong Công việc bằng trình gỡ lỗi?

AggregateException dự kiến ​​sẽ được ném, theo MSDN, có chứa một ngoại lệ bên trong với thông báo hello. Thay vào đó, ngoại lệ hello này không được giải quyết. Nó xảy ra khi bên trong một trình gỡ rối.

Nếu bạn nhấn tiếp tục hoặc chạy độc lập, nó hoạt động như mong đợi. Có cách nào để tránh nhấn tiếp tục tất cả thời gian trong VS? Xét cho cùng, mọi thứ nằm trong một khối Try...Catch được coi là được xử lý trong một mô hình lập trình luồng đơn. Nếu không, gỡ lỗi có thể là một cơn ác mộng.

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

C#

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

Có một cái gì đó rõ ràng tôi đang thiếu ở đây?

+0

Đặt trình gỡ lỗi để tạm dừng trên tất cả các ngoại lệ. Nó dừng ở đâu? Nó sẽ dừng lại trong 'TaskThatThrowsException' và trên' Wait'. – usr

+0

@usr: ngay cả bây giờ nó dừng lại ở dòng 'Throw New Exception ("hello") ', kiểm tra tất cả Thrown không làm cho nó tốt hơn. Tôi muốn nó không dừng lại ở đó, và thay vì xử lý Console.WriteLine. Nếu không, gỡ lỗi có thể là một cơn ác mộng. – Neolisk

+0

Trường hợp ngoại lệ từ các tác vụ không xuất hiện trong StartNew, chỉ trong .Wait(). Dim myTask = Task.Factory.StartNew (...) Thử MyTask.Wait() Catch ... – adrianm

Trả lời

2

Cài đặt "Bật chỉ mã của tôi" có ảnh hưởng đến điều này. Trong Tools-> Options, Debugging-> General-> enable Just My Code. Nếu bạn đã bật tính năng này, nó sẽ xem xét ngoại lệ được giải quyết nếu của bạn không xử lý được. Hãy thử tắt tùy chọn này.

Xem: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1. Vì vậy, nó có vẻ như cách tiếp cận này được khuyến cáo bởi Microsoft, cho trường hợp cụ thể này. Đoán tôi nên đọc MSDN cẩn thận hơn trong lần tới, vì tôi chắc chắn rằng tôi liếc nhanh qua trang cụ thể này trước khi hỏi câu hỏi này. Cảm ơn nhiều! – Neolisk

2

Điều này rất có thể do bạn hiểu nhầm những gì hộp thoại Visual Studio đang nói.

Trường hợp ngoại lệ là "người dùng bị bỏ cấm", bởi vì không có mã người dùng nào bắt được nó (bản gốc Exception), nó bị TPL bắt giữ. Vì vậy, nếu bạn để trình gỡ rối tiếp tục, hoặc nếu bạn chạy ứng dụng của mình mà không có trình gỡ lỗi, bạn sẽ thấy hành vi mà bạn đang mong đợi.

+0

+1. Vâng, với các trường hợp ngoại lệ bình thường, chúng được coi là xử lý, nếu trong một khối 'Try ... Catch' (và loại tương ứng, và không được rethrown, tất nhiên). Làm thế nào khác tôi phải gỡ lỗi ứng dụng của tôi? Nhấn tiếp tục mọi lúc trong các trường hợp tương tự? Có cách nào để làm cho VS không nắm bắt những trường hợp ngoại lệ khi gỡ lỗi? – Neolisk

+1

@Neolisk Debug-> Exceptions-> Uncheck Thrown – Marc

+0

@Marc: Thrown đã được bỏ chọn ở khắp mọi nơi. – Neolisk

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