处理 urllib2 的超时? - Python

Posted

技术标签:

【中文标题】处理 urllib2 的超时? - Python【英文标题】:Handling urllib2's timeout? - Python 【发布时间】:2011-02-12 08:11:20 【问题描述】:

我在 urllib2 的 urlopen 中使用 timeout 参数。

urllib2.urlopen('http://www.example.org', timeout=1)

我如何告诉 Python 如果超时到期,应该引发自定义错误?


有什么想法吗?

【问题讨论】:

注:timeout parameter doesn't limit neither the total connection time nor total read (response) time. 【参考方案1】:

在极少数情况下您想使用except:。这样做会捕获任何异常,这可能很难调试,它会捕获包括SystemExitKeyboardInterupt 在内的异常,这会使您的程序使用起来很烦......

在最简单的情况下,你会捕捉到urllib2.URLError

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError, e:
    raise MyException("There was an error: %r" % e)

以下应捕获连接超时时引发的特定错误:

import urllib2
import socket

class MyException(Exception):
    pass

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError, e:
    # For Python 2.6
    if isinstance(e.reason, socket.timeout):
        raise MyException("There was an error: %r" % e)
    else:
        # reraise the original error
        raise
except socket.timeout, e:
    # For Python 2.7
    raise MyException("There was an error: %r" % e)

【讨论】:

这在 Python 2.7 中不起作用,因为 URLError 不再捕获 socket.timeout @TalWeiss 谢谢,为socket.timeout添加了一个额外的捕获 至于 Python 2.7.5 超时被 urllib2.URLError 捕获。 @dbr 谢谢,而且它应该是hasattr(e,'reason') and isinstance(e.reason, socket.timeout),因为HttpError至少在Python 2.6中没有reason属性。 对于它的价值,python 2.6.6 尝试连接的超时似乎导致urllib2.URLError。从慢速服务器读取响应时超时似乎导致socket.timeout。所以总的来说,捕捉两者可以让你区分这些情况。【参考方案2】:

在 Python 2.7.3 中:

import urllib2
import socket

class MyException(Exception):
    pass

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError as e:
    print type(e)    #not catch
except socket.timeout as e:
    print type(e)    #catched
    raise MyException("There was an error: %r" % e)

【讨论】:

以上是关于处理 urllib2 的超时? - Python的主要内容,如果未能解决你的问题,请参考以下文章

HTTP请求的python实现(urlopenheaders处理 Cookie处理设置Timeout超时 重定向Proxy的设置)

如何处理 urllib2 套接字超时?

Pythonu用户交互

使用 urllib2 或任何其他 http 库读取超时

Python http客户端库requests & urllib2 以及ip地址处理IPy

python爬虫中遇到的假死问题