wtorek, 13 listopada 2012

async, await - przechwytywanie wyjątków

Ł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