【问题标题】:F#: System.Net.WebExceptionF#: System.Net.WebException
【发布时间】:2015-03-26 13:35:57
【问题描述】:

我是编程新手,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#交互中测试了downloadHtmlFromUrl函数,效果很好。)

我意识到如果地址无效,上面的代码不会返回布尔值。相反,会引发 System.Net.WebException,并显示消息“System.Net.WebException:远程服务器返回错误:(404) Not Found”。

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

【问题讨论】:

  • A WebException(实际上是所有异常)都有一个描述问题所在的消息属性。那么,有什么问题呢? URL 是否有效、为空、不存在?
  • 这是错误消息:“System.Net.WebException:远程服务器返回错误:(404) 未找到。”
  • 你想做什么?无效地址会引发异常,因为服务器本身将返回 404 错误响应而不是网页。它不必返回体内的任何东西。要么捕获异常,要么更改 downloadHtmlFromUrl 的代码,以免出错。例如。使用 HttpClient 代替 WebClient 并检查响应状态码

标签: exception web f#


【解决方案1】:

也许捕捉到异常?

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,该程序将返回false,无论出于何种原因引发异常。如果您想专门针对 404 响应返回 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多