【问题标题】:Python try/except statement for socket error Errno 10060用于套接字错误 Errno 10060 的 Python try/except 语句
【发布时间】:2014-04-22 18:48:30
【问题描述】:

我有一个 Python 2.7 脚本,它包括从数据库中打开/抓取多个 URL 并从网页中提取一些信息。代码可能需要长达 8 小时才能运行,而且我正在处理多个网站。

偶尔(1-2 小时),我在尝试打开 URL 时随机收到错误消息 IOError: [Errno socket error] [Errno 10060]

IOError: [Errno socket error] [Errno 10060] A connection attempt
failed because the connected party did not properly respond after a
period of time, or established connection failed because connected
host has failed to respond

我试图通过在 URL 打开操作之间添加 2 秒暂停和 time.sleep(2) 来避免错误,但我仍然收到错误。该错误似乎与我尝试打开 URL 的网站无关。

我正在寻找一种方法来防止我的脚本使用 try/except 语句崩溃。
如果发生套接字错误,脚本将暂停 20 秒,然后重试打开 URL。如果 URL 正确打开,请继续使用脚本。我正在使用urlopen() 打开网址。

【问题讨论】:

  • 如果你能显示你的代码会很方便。
  • 如果您向我们展示引发异常的代码的特定部分会更方便。
  • 如果可能的话显示堆栈跟踪

标签: python urlopen try-except


【解决方案1】:

当您的代码引发 IOError 时,请运行此代码,但将您的错误行替换为 raise

try:
    raise IOError
except IOError:
    time.sleep(20)
    pass
else:
    break

【讨论】:

    【解决方案2】:

    由于这种情况非常罕见,而且每隔一小时左右才会发生一次,您可能会责怪您的互联网连接。您要查找的代码是:

    import time
    for url in urls:
        while True:
            try:
                response = urllib2.urlopen(url)
                #Do stuff
            except :
                time.sleep(20)
            else :
                #stops the inner loop if there is no error
                break
    

    【讨论】:

    • 谢谢。我应该将打开 URL 后必须执行的命令放在 response = urllib2.urlopen(url) 之后还是最后一行 break 之后。什么会更有效率和可读性?在 URL 打开部分之后,我有大约 20 行代码要执行
    • 我会在 else 块中执行此操作,但这取决于您是否期望其中有任何异常。我认为 try 块应该包含尽可能少的代码。如果你想处理后续代码引发的异常,我会把它放在另一个 try 块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2018-02-24
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多