Tôi về cơ bản tự hỏi làm thế nào tôi nên, trong C#, bắt ngoại lệ từ các phương pháp không đồng bộ được chờ đợi thông qua các từ khóa await
. Hãy xem xét ví dụ chương trình điều khiển nhỏ sau đây, quan trọng nhất là chứa một phương thức có tên là AwaitSync
. AwaitSync
gọi TestAsync
, trả về Tác vụ khi được thực hiện ném ngoại lệ. Tôi cố gắng nắm bắt ngoại lệ trong AwaitAsync
, nhưng nó không được giải quyết.Làm thế nào để bắt C# ngoại lệ từ một phương pháp không đồng bộ được chờ đợi?
class Program
{
static void Main(string[] args)
{
AwaitAsync();
Console.ReadKey();
}
static async Task AwaitAsync()
{
try
{
await TestAsync();
}
catch (Exception)
{
Console.WriteLine("Exception caught");
}
}
static Task TestAsync()
{
return Task.Factory.StartNew(() => { throw new Exception("Test"); });
}
}
Làm cách nào để bắt ngoại lệ từ Tác vụ được trả về TestAsync
? Trong khi ví dụ này là một chương trình điều khiển, thì vấn đề thực tế của tôi là trong ngữ cảnh của ASP.NET MVC/Web API.
CHỈNH SỬA: Tắt ngoại lệ bị bắt vì lý do kỹ thuật Tôi không nhận thấy thông báo 'Ngoại lệ bị bắt' trước khi trạm đóng. Trong mọi trường hợp, câu trả lời của Jon Skeet rất có giá trị với sự hiểu biết của tôi về await
và xử lý ngoại lệ.
Bạn có nói rằng điều này không hoạt động? – jishi
Khi tôi chạy mã của bạn, tôi thấy "Ngoại lệ bị bắt". – spender
Nó không bị bắt cho tôi. Tôi sẽ kiểm tra lại. – aknuds1