czwartek, 6 lutego 2014

Jeśli w metodzie z modyfikatorem async oraz zwracające obiekt typu Task, wystąpi nieobsłużony wyjątek, wówczas jest on przekazywany dalej do metody wywołującej wypomnianą metodę, za pomocą zwracanego obiektu. W celu łapania wyjątków można zatem użyć konstrukcji try {} catch {} na zewnątrz metody wywoływanej z operatorem await.

Poniżej mamy metodę, która generuje wyjątek.

async Task<int> ExceptionFuncAsync(string integer)
{
  int result = await StrToIntAsync(integer);
  throw new Exception("My exception.");
  return result;
}

Wyjątek ten można łapać w następujący sposób:

async void FuncCatchExAsync(string integer)
{
  try
  {
    int result = await ExceptionFuncAsync(integer);
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex);
  }
}

Jeśli wyjątek powstanie wewnątrz wyrażenia lambda, które jest składowym obiektu typy Task,  wówczas nie jest możliwe przechwytywanie tego wyjątku, w podany wyżej sposób. Poniżej mamy metodę zwracającą obiekt typu Task, wykonujący akcję zawierającą wystąpienie wyjątku:


Task GetTaskWithException()
{
  Action action = () => 
  { 
    throw new Exception("My uncatched ex"); 
  };

  return Task.Factory.StartNew(action);
}


Dalej implementując:


async Task WrongTryCachException()
{
    try
    {
        await GetTaskWithException();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

Nie złapiemy wyjątku wygenerowanego w akcji zdefiniowanej w metodzie GetTaskWithException.

POBIERZ PRZYKŁAD

Await, Async & try { } catch { }

0 komentarze :

Prześlij komentarz