2013-05-20 13 views
5

Próbuję napisać kod nieblokujący w języku F #. Muszę pobrać stronę internetową, ale czasami ta strona nie istnieje i generowany jest wyjątek (404 Not Found) AsyncDownloadString. Próbowałem kodu poniżej, ale nie kompiluje.Obsługa wyjątków asynchronicznych w języku F #

Jak obsługiwać wyjątek od AsyncDownloadString?

Jak mam sobie radzić z wyjątkiem tutaj? Jeśli zostanie zgłoszony błąd, po prostu chcę zwrócić pusty ciąg lub ciąg z komunikatem.

Odpowiedz

11

Wystarczy dodać słowa kluczowego return po powrocie swój ciąg błędzie:

let downloadPage(url: System.Uri) = async { 
    try 
     use webClient = new System.Net.WebClient() 
     return! webClient.AsyncDownloadString(url) 
    with error -> return "Error" 
} 

IMO lepszym rozwiązaniem byłoby wykorzystanie Async.Catch zamiast wrócić ciąg błędzie:

let downloadPageImpl (url: System.Uri) = async { 
    use webClient = new System.Net.WebClient() 
    return! webClient.AsyncDownloadString(url) 
} 

let downloadPage url = 
    Async.Catch (downloadPageImpl url) 
+0

Dziękuję Jack! To działa! :) Dlaczego Twoim zdaniem Async.Catch jest lepszym rozwiązaniem. Sądzę, że obsługa wyjątków powinna być wykonana w downloadPage, nie? – Martin

+2

Myślę, że 'Async.Catch' jest lepszy, ponieważ: (1) zachowuje informacje o błędzie ... są inne powody, dla których wyjątek może być wyrzucony poza 404, i mając wyjątek zamiast" Błąd "ułatwia to zdiagnozować problem; (2) użycie 'Choice <_,_>' pozwala na użycie systemu typu do wymuszania ścieżek przetwarzania zarówno dla wyników, jak i błędów. –