2013-05-20 22 views
5

F#で非ブロックコードを書き込もうとしています。私はWebページをダウンロードする必要がありますが、Webページが存在せず、AsyncDownloadStringによって例外がスローされます(404 Not Found)。私は以下のコードを試しましたが、コンパイルされません。F#での非同期例外処理

どのようにしてAsyncDownloadStringから例外を処理できますか?

私はここで例外を処理するとしますか?エラーがスローされた場合は、空の文字列またはメッセージ内の文字列を返したいだけです。

答えて

11

あなたはエラー文字列を返すときだけreturnキーワードを追加します。

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

IMOより良いアプローチは、エラー文字列を返す代わりにAsync.Catchを使用することです:

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

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

はあなたにジャックをありがとう!できます! Async.Catchはなぜ良いアプローチだと思いますか?私は、例外処理はdownloadPageで行うべきだと思いますか? – Martin

+2

私は 'Async.Catch'が優れていると思います:(1)エラーに関する情報を保持しています... 404以外に例外がスローされる理由が他にもあります。問題を診断する。 (2) 'Choice <_,_>'を使うと、型システムを使って結果とエラーの両方の処理パスを強制することができます。 –

関連する問題