Zasadniczo zastanawiam się, jak powinienem, w języku C#, przechwytywać wyjątki od metod asynchronicznych, które czekają za pośrednictwem słowa kluczowego await
. Rozważmy na przykład następujący mały program konsoli, który przede wszystkim zawiera metodę o nazwie AwaitSync
. AwaitSync
dzwoni TestAsync
, która zwraca zadanie, które po wykonaniu zgłasza wyjątek. Próbuję złapać wyjątek w AwaitAsync
, , ale nieobsługiwany.Jak złapać w C# wyjątek od metody asynchronicznej, który jest oczekiwany?
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"); });
}
}
Jak mam się do tego zabrać połowu wyjątek od zadania zwracany przez TestAsync
? Podczas gdy ten przykład jest programem konsolowym, mój prawdziwy problem jest związany z ASP.NET MVC/Web API.
EDIT: Okazuje się, że wyjątek jest złapanym przyczyn technicznych po prostu nie zauważył komunikat „wyjątek” złapany przed terminal zamknięty. W każdym razie odpowiedź Jona Skeeta była bardzo cenna dla mojej wiedzy o obsłudze wyjątków.
Czy mówisz, że to nie działa? – jishi
Po uruchomieniu kodu widzę "Wyłapany wyjątek". – spender
To nie mnie złapie. Sprawdzę ponownie. – aknuds1