2015-04-01 3 views
2

Я новичок в программировании, а F # - мой первый язык.F #: Выход из цикла

У меня есть список URL-адресов, которые при первом доступе либо возвратили ошибку HTTP 404, либо опытное время ожидания шлюза. Для этих URL-адресов я хотел бы попытаться получить доступ к ним еще 3 раза. В конце этих трех попыток, если ошибка WebException все еще запущена, я предполагаю, что URL-адрес не существует, и я добавлю его в текстовый файл, содержащий все недопустимые URL-адреса.

Вот мой код:

let tryAccessingAgain (url: string) (numAttempts: int) = 
    async { 
     for attempt = 1 to numAttempts do 
      try 
       let! html = fetchHtmlAsync url 
       let name = getNameFromPage html 

       let id = getIdFromUrl url 

       let newTextFile = File.Create(htmlDirectory + "\\" + id.ToString("00000") + " " + name.TrimEnd([|' '|]) + ".html") 
       use file = new StreamWriter(newTextFile) 
       file.Write(html) 
       file.Close() 
      with 
       :? System.Net.WebException -> File.AppendAllText("G:\User\Invalid URLs.txt", url + "\n") 
     } 

Я испытал fetchHtmlAsync, getNameFromPage и getIdFromUrl в F # Interactive. Все они отлично работают.

Если мне удастся загрузить содержимое HTML-адреса URL-адреса без использования всех трех попыток, я, очевидно, хочу немедленно выйти из цикла for-loop. Мой вопрос: как я могу это сделать?

ответ

4

использование рекурсии вместо цикла:

let rec tryAccessingAgain (url: string) (numAttempts: int) = 
    async { 
     if numAttempts > 0 then 
      try 
       let! html = fetchHtmlAsync url 
       let name = getNameFromPage html 

       let id = getIdFromUrl url 

       let newTextFile = File.Create(htmlDirectory + "\\" + id.ToString("00000") + " " + name.TrimEnd([|' '|]) + ".html") 
       use file = new StreamWriter(newTextFile) 
       file.Write(html) 
       file.Close() 
      with 
      | :? System.Net.WebException -> 
       File.AppendAllText("G:\User\Invalid URLs.txt", url + "\n") 
       return! tryAccessingAgain url (numAttempts-1) 
     } 

Обратите внимание, что я не мог проверить его и там могут быть некоторые ошибки синтаксиса - извините, если

, как мы на это - вы можете захотеть перепишем регистрацию недействительного URL, как это:

let rec tryAccessingAgain (url: string) (numAttempts: int) = 
    async { 
     if numAttempts <= 0 then 
      File.AppendAllText("G:\User\Invalid URLs.txt", url + "\n") 
     else 
      try 
       let! html = fetchHtmlAsync url 
       let name = getNameFromPage html 

       let id = getIdFromUrl url 

       let newTextFile = File.Create(htmlDirectory + "\\" + id.ToString("00000") + " " + name.TrimEnd([|' '|]) + ".html") 
       use file = new StreamWriter(newTextFile) 
       file.Write(html) 
       file.Close() 
      with 
      | :? System.Net.WebException -> 
       return! tryAccessingAgain url (numAttempts-1) 
     } 

Таким образом, он будет зарегистрирован только один раз попытки, когда все сделанные

Смежные вопросы