2013-05-20 16 views
5

Ich versuche nicht blockierenden Code in F # zu schreiben. Ich muss eine Webseite herunterladen, aber irgendwann existiert diese Webseite nicht und eine Ausnahme wird von AsyncDownloadString ausgelöst (404 Not Found). Ich habe den folgenden Code ausprobiert, aber er kompiliert nicht.Async-Ausnahmebehandlung in F #

Wie kann ich mit Ausnahme von AsyncDownloadString umgehen?

Wie soll ich hier Ausnahme behandeln? Wenn ein Fehler ausgelöst wird, möchte ich einfach eine leere Zeichenfolge oder eine Zeichenfolge mit einer Nachricht zurückgeben.

Antwort

11

Fügen Sie einfach den return Schlüsselwort, wenn Sie Ihre Fehlerzeichenfolge zurück:

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

IMO ein besserer Ansatz Async.Catch anstelle der Rücksendung einen Fehlerstring zu verwenden wäre:

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

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

Sie Jack Dank! Es klappt! :) Warum denkst du Async.Catch ist ein besserer Ansatz? Ich würde denken, dass die Ausnahmebehandlung in downloadPage durchgeführt werden sollte, nein? – Martin

+2

Ich denke 'Async.Catch' ist besser, weil: (1) es Informationen über den Fehler bewahrt ... es gibt andere Gründe, die eine Ausnahme neben einem 404 ausgelöst werden können, und die Ausnahme anstelle von" Error "macht es einfacher das Problem diagnostizieren; (2) Mit 'Choice <_,_>' können Sie das Typsystem verwenden, um die Verarbeitungspfade für die Ergebnisse und die Fehler zu erzwingen. –