【问题标题】:How do I catch a specific HTTP error in Python?如何在 Python 中捕获特定的 HTTP 错误?
【发布时间】:2011-03-12 16:56:54
【问题描述】:

我有

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

但我最终会发现任何类型的 HTTP 错误。我只想在指定的网页不存在时捕获(404?)。

【问题讨论】:

标签: python http urllib2 urllib


【解决方案1】:

Python 3

from urllib.error import HTTPError

Python 2

from urllib2 import HTTPError

只要捕获HTTPError,处理它,如果不是错误404,只需使用raise重新引发异常。

请参阅Python tutorial

这是 Python 2 的完整示例:

import urllib2
from urllib2 import HTTPError
try:
   urllib2.urlopen("some url")
except HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise

【讨论】:

  • 我可以执行 urllib2.urlopen("*") 来处理任何 404 错误并将它们路由到我的 404.html 页面吗?
  • @TobiasKolb:由于问题被标记为urllib2(毕竟,它已经超过 9 年了)并且urllib3 不是标准库的一部分,我认为这不适合这里。如果没有重复,也许打开一个新问题?或使用urllib,如下面 Lazik 的回答所述。
  • 我正在编写回归测试,所以我想访问 urlopen 响应,即使它是 404。即使我从 urllib2.urlopen("some url") 分配值,我也不能在里面使用那个值异常——它将导致另一个异常。那么,如何获取返回的 404 页面的响应文本呢?
  • 我找到了答案:您可以使用 HTTPError 实例作为响应。 docs.python.org/3/howto/urllib2.html#httperror
【解决方案2】:

Tim 的answer 在我看来具有误导性,尤其是当urllib2 没有返回预期的代码时。例如,这个错误将是致命的(信不信由你——下载 url 时并不少见):

AttributeError: 'URLError' 对象没有属性 'code'

快速,但也许不是最好的解决方案是使用嵌套 try/except 块的代码:

import urllib2
try:
    urllib2.urlopen("some url")
except urllib2.HTTPError as err:
    try:
        if err.code == 404:
            # Handle the error
        else:
            raise
    except:
        ...

更多关于嵌套 try/except 块主题的信息Are nested try/except blocks in python a good programming practice?

【讨论】:

    【解决方案3】:

    对于 Python 3.x

    import urllib.request
    from urllib.error import HTTPError
    try:
        urllib.request.urlretrieve(url, fullpath)
    except urllib.error.HTTPError as err:
        print(err.code)
    

    【讨论】:

    猜你喜欢
    • 2019-02-20
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2023-03-15
    • 2013-02-16
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多