Обработка исключений с помощью объекта WebClient - PullRequest
0 голосов
/ 11 декабря 2010

Я написал функцию для инициирования загрузки по URL-адресу и объекту WebClient в F #.Тем не менее, когда я пишу свой оператор try .. with, он выдает ошибку «Неполная структурированная конструкция в этой точке выражения или перед ней».

let urlDownload(url:string, webClient:WebClient) = 
async {
    try 
        let uri = new Uri(url)
        /// References for progress queries
        let contentLength = ref 0L
        let bytesReceived = ref 0L
        /// Updates progress statistics as progress is made
        webClient.DownloadProgressChanged.Add(
            fun args ->
                if !contentLength = 0L && webClient.ResponseHeaders.Get "Content-Length" <> null then
                    contentLength := webClient.ResponseHeaders.Get "Content-Length" |> Int64.Parse
                bytesReceived := !bytesReceived + args.BytesReceived
        )
        let! html = webClient.AsyncDownloadString(uri)
    with
        | :? UriFormatException -> printfn "Invalid URL"
 }

Он основан на коде из MSDN здесь

Что действительно странно, так это то, что если я поставлю printfn перед блоком withкомпилируется без ошибок.Однако, когда я запускаю его, он генерирует исключение UriFormatException, которое предположительно должно быть перехвачено блоком with.

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Как говорит Брайан, проблема в том, что вы заканчиваете блок (тело попытки) с помощью let!, но бессмысленно заканчивать выражение связыванием. Предположительно, вы хотите, чтобы ваша функция действительно возвращала HTML, поэтому вы должны сделать:

let! html = webClient.AsyncDownloadString(uri)
return html

или эквивалентно, просто return! webClient.AsyncDownloadString(uri).

1 голос
/ 11 декабря 2010

Что действительно странно, так это то, что если я поставлю printfn перед блоком с Проект компилируется без ошибок.

Это ожидается. let! не может быть последней строкой блока async, точно так же, как let не может быть последней строкой нормального блока. (Напомним, что

let x = 42
blah(x)

является сокращением для выражения

let x = 42 in blah(x)

)

Я думаю, что я не верю вам относительно UriFormatException. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...