Łapanie wyjątków w metodzie asynchronicznej nie jest niczym skomplikowanym. Należy tylko pamiętać o tym, iż mamy do czynienia z różnymi możliwymi scenariuszami wyjątków.
Metoda oznaczona słowem kluczowym async zawiera przeważnie jedną lub więcej wywołań metod ze słowem kluczowym await. Await stoi przed metodą zwracającą typ Task lub Task<TResult>.
Pierwsza zasada to ta, iż await nie może się pojawić się w bloku catch lub finally.
Rezultat - Task - na który oczekujemy może przejść do stanu błędu:
Code:
static void Main(string[] args)
{
var i = DoSomeWork();
}
static async Task<int> DoSomeWork()
{
int res = 0;
var task = Length();
try
{
res = await task;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("----------------------");
Console.WriteLine("Is canceled: " + task.IsCanceled);
Console.WriteLine("Is completed: " + task.IsCompleted);
Console.WriteLine("Is fauled: " + task.IsFaulted);
return res;
}
static async Task<int> Length()
{
throw new Exception();
}
Zgłoszono wyjątek typu 'System.Exception'.
----------------------
Is canceled: False
Is completed: True
Is fauled: True
Tak może także przejść do stanu Canceled - anulowany. Metoda w takim przypadku rzuci wyjątek OperationCanceledException:
Code:
static void Main(string[] args)
{
var i = DoSomeWork();
}
static async Task<int> DoSomeWork()
{
int res = 0;
var task = Length();
try
{
res = await task;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("----------------------");
Console.WriteLine("Is canceled: " + task.IsCanceled);
Console.WriteLine("Is completed: " + task.IsCompleted);
Console.WriteLine("Is fauled: " + task.IsFaulted);
return res;
}
static async Task<int> Length()
{
throw new OperationCanceledException();
}
Operacja została anulowana.
----------------------
Is canceled: True
Is completed: True
Is fauled: False
Brak komentarzy:
Prześlij komentarz