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?
Đặ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
@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
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