当前位置: 首页 > 知识库问答 >
问题:

使用urllib 2捕获错误60(超时)

萧嘉茂
2023-03-14

我试图捕捉错误60并继续执行脚本,下面是我目前正在做的事情:

import urllib2
import csv
from bs4 import BeautifulSoup


matcher = csv.reader(open('matcher.csv', "rb" ))

for i in matcher:
    url = i[1]
    if len(list(url)) > 0:
        print url
        try:
            soup = BeautifulSoup(urllib2.urlopen(url,timeout=10))   

        except urllib2.URLError, e:
            print ("There was an error: %r" % e)

它返回这个:

回溯(最后一次调用):文件“debug.py”,第13行,在urlopen return\u opener中的soup=BeautifulSoup(urlib2.urlopen(url,timeout=10))文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urlib2.py”,第126行。打开(url、数据、超时)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第400行,在open response=self中_打开(req,数据)文件“/Library/Frameworks/python2.7/Versions/lib/python2.7/urllib2.py”,第418行,在“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”文件“/Library/Frameworks/python2.7/urllib2.py”中,第378行,在调用链结果=func(*args)文件中,第1207行,在http_open return self中。do_open(httplib.HTTPConnection,req)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第1180行,在getresponse中的do_open r=h.getresponse(buffering=True)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第1030行。begin()文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第407行,在begin版本中,状态为,reason=self_read_status()文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第365行,在_read_status line=self中。外交政策。readline()文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py”,第447行,在readline data=self中_短袜recv(自身尺寸)插座。超时:超时

我如何抓住这个错误并“继续”?

共有2个答案

欧阳哲
2023-03-14

您可以尝试,除了例外作为e:来捕获所有错误。但是请记住,这会捕获所有错误,如果您只想捕获特定的错误,应该避免。

编辑:您可以通过执行以下操作来检查异常类型:

except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]      
    print(exc_type, fname, exc_tb.tb_lineno)
卢英范
2023-03-14

您可以导入异常对象并修改except块:

import socket

try:
    soup = BeautifulSoup(urllib2.urlopen(url,timeout=10))   

except urllib2.URLError as e:
    print ("There was an error: %r" % e)
except socket.timeout as e: # <-------- this block here
    print "We timed out"

更新:嗯,学到了一些新的东西——只是找到了一个对的引用。原因属性:

except urllib2.URLError as e:
    if isinstance(e.reason, socket.timeout):
        pass # ignore this one
    else:
        # do stuff re other errors if you can...
        raise # otherwise propagate the error
 类似资料:
  • 我无法用axios捕捉错误响应。怎么做?我用的是: 我看到ajax请求的结果有400个状态代码,响应主体看起来像(Django后端)。没关系,我已经准备好在catch处理程序中处理这些错误了。 但是它们转到成功处理程序。为何如此?我在控制台中看到以下输出: 成功处理程序接收axios错误对象作为结果。为什么会这样,下一步该怎么办?此错误对象不包含任何有用信息。 UPD。实际上,错误对象包含有用的信

  • 我正在从后端代码发送状态代码422,其中包含错误描述的响应正文。我使用axios post发布请求,如下所示: 问题是,当后端返回错误代码422时,我捕获的错误对象没有关于响应体的信息。有什么方法可以检索错误文本吗?

  • 我想摆脱这个错误。我读到一个类似的问题,其中一个答案建议我可以使用以下命令禁用验证: 我的确切错误是: 在C:\ path \ guzzle \ src \ Handler \ cURL factory . PHP:187堆栈跟踪:# 0 C:\ path \ guzzle \ src \ Handler \ cURL factory . PHP:187堆栈跟踪:# 0 C:\ path \ gu

  • 所以我有一个sub-reddits列表,我用urllib打开它们。在我仔细研究之后,urllib最终失败了: 做了一些研究,我发现reddit通过IP限制了对其服务器的请求数量: 每两秒钟不要提出超过一个请求。请求的突发有一定的空间,但要保持理智。一般来说,一分钟内不要超过30个请求。 所以我想我应该使用将我的请求限制在每10秒一页。这最终也失败了。 上面的引用是从reddit API页面获取的。

  • 是否可以使用promises的ES6语法捕获异步错误?例如,以下操作不起作用(.catch未捕获错误): 但是这个同步版本有: 使用try/catch块和清除catch中的错误是执行以下操作的唯一解决方案吗? 对于这个问题,假设抛出错误的代码部分位于另一个命名函数中,因此它没有访问函数的权限。 谢谢 编辑:这里有一个更完整的示例,说明我想在JSFIDLE中做什么。

  • 我有一个应用程序使用了log4j1.2.17,现在我想把它更改为log4j2。所以我更改了pom.xml(我确信我已经删除了任何依赖项中的log4j1),添加了log4j2.xml。log4j2工作得很好,它记录了我想要的信息。 我查看log4j的问题。LOG4J2-2026似乎可以解决这个问题,但是我使用的log4j2版本已经是2.9.1了。我不知道是什么原因造成这个错误。