2014-09-08 7 views
8

I mają następujące kodu w Xamarin (testowana ios)Xamarin Wyjątki uzyskane z zadań nie namnaża

private static async Task<string> TaskWithException() 
{ 
    return await Task.Factory.StartNew (() => { 
     throw new Exception ("Booo!"); 
     return ""; 
    }); 
} 

public static async Task<string> RunTask() 
{ 
    try 
    { 
     return await TaskWithException(); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
     throw; 
    } 
} 

Wywołanie to jako await RunTask(), czy wyjątek dalej od sposobu TaskWithException, ale sposób zaczep w RunTask nigdy nie zostanie trafiony. Dlaczego? Spodziewam się, że haczyk zadziała tak samo, jak w przypadku async/await firmy Microsoft. Czy czegoś brakuje?

+1

Czy używasz '.Result',' Wait' lub 'WaitAll' w dowolnym miejscu kodu, bezpośrednio lub pośrednio odwołując się do zadania zwróconego przez' RunTask'? – Noseratio

+0

Działa to zgodnie z oczekiwaniami w aplikacji konsoli w VS2013. –

+0

Kod został wywołany z konstruktora widoku formularzy Xamarin. Nie sądziłem, że ten szczegół był istotny, ale wygląda na to, że uruchomienie takiego zadania z konstruktora nie uruchamia procedury obsługi wyjątku. – madaboutcode

Odpowiedz

5

Nie można zastosować metody w środku obiektu , dlatego nie można rozpoznać wartości Exception.

Aby złapać Exception, musisz wykonać operację pod .

Mam tutaj dwa sposoby wywoływania metody asynchronicznej z konstruktora:

1.ContinueWith rozwiązanie

RunTask().ContinueWith((result) => 
{ 
    if (result.IsFaulted) 
    { 
     var exp = result.Exception; 
    }  
}); 

2. Xamarin Forms

Device.BeginInvokeOnMainThread(async() => 
{ 
    try 
    { 
     await RunTask();  
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
    }  
}); 

iOS

InvokeOnMainThread(async() => 
{ 
    try 
    { 
     await RunTask();  
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
    }  
}); 
+2

Dziękuję za poświęcenie czasu na odpowiedź na to stare pytanie. Z tego co pamiętam, użyliśmy # 2, aby rozwiązać problem w tym czasie. Wstyd mi, że nie podążam i odpowiadam na moje własne pytanie! :( – madaboutcode

Powiązane problemy