F#:System.Net.WebException

F#: System.Net.WebException

我是编程新手,F# 是我的第一语言。我目前对.NET API 还很陌生。

作为初学者的项目,我想抓取一个网站。我想编写一个函数,给定一个特定的 URL,自动下载该页面上的所有 HTML 内容。但是,如果 URL 无效,我不想抛出 System.Net.WebException 消息,而是 return 布尔输出 "False"。

这是我的代码的相关部分:

let noSuchURL (url: string) =
    let html = downloadHtmlFromUrl url
    let regexPattern = @"<title>Page not found</title>"
    let matchResult = Regex.IsMatch(html, regexPattern)
    matchResult

(我在F# interactive中测试了downloadHtmlFromUrl函数,没问题。)

我意识到上面的代码在地址无效的情况下不会 return 布尔值。相反,System.Net.WebException 被抛出,消息为 "System.Net.WebException: The remote server returned an error: (404) Not Found".

我可以进行哪些更改以获得布尔输出?

也许能捕捉到异常?

let noSuchURL (url: string) =
  try
    let html = downloadHtmlFromUrl url
    let regexPattern = @"<title>Page not found</title>"
    let matchResult = Regex.IsMatch(html, regexPattern)
    matchResult
  with :? System.Net.WebException -> false

一个警告:如果有 WebException,这个程序将 return false,无论是什么原因引发的异常。如果你想在 404 响应中专门 return false,你必须仔细查看 WebException:

let noSuchURL (url: string) =
  try
    let html = downloadHtmlFromUrl url
    let regexPattern = @"<title>Page not found</title>"
    let matchResult = Regex.IsMatch(html, regexPattern)
    matchResult
  with 
    :? System.Net.WebException as e 
       when e.Status = WebExceptionStatus.ProtocolError ||
            e.Status = WebExceptionStatus.NameResolutionFailure
       -> false

有关 F# 异常的更多信息,请查看 https://msdn.microsoft.com/en-us/library/dd233194.aspx