F#:System.Net.WebException

时间:2015-03-26 13:35:57

标签: exception web f#

我是编程新手,F#是我的第一语言。我目前对.NET API仍然非常不熟悉。

作为初学者的项目,我想抓一个网站。我想编写一个函数,给定一个特定的URL,自动下载该页面上的所有HTML内容。但是,如果URL无效,而不是抛出System.Net.WebException消息,我想返回布尔输出“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函数,它运行正常。)

我意识到上面的代码在地址无效的情况下不会返回布尔值。而是抛出System.Net.WebException,并显示消息“System.Net.WebException:远程服务器返回错误:(404)Not Found”。

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

1 个答案:

答案 0 :(得分:2)

也许抓住异常?

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

有一点需要注意:如果存在false,此程序将返回WebException,无论引发异常的原因是什么。如果您想要专门回复false 404回复,则必须仔细查看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