我应该如何在python中关闭urllib.urlopen连接

时间:2014-11-04 11:39:58

标签: python

我有一个从URL读取的python代码。

 def submitTest(self,url):
    response = None
    if url is not None:
        wptUrl = WebPageTestConfigUtils.getConfigValue('runTestURL')+"?f=json&url="+url+"&runs=3&video=1&web10=0&fvonly=1&mv=1&private=1&location=us_east_wptdriver:Chrome.DSL"
        with closing(urllib.urlopen(wptUrl)) as response:
            json.load(response)
            return response["data"]["testId"]

我使用上下文lib docs https://docs.python.org/2/library/contextlib.html来关闭python连接。但是我在执行时遇到以下错误。

Traceback (most recent call last):
File "webPageTestUtils.py", line 59, in <module>
main()
File "webPageTestUtils.py", line 56, in main
print webPageTestProcessor.submitTest("www.amazon.com")
File "webPageTestUtils.py", line 27, in submitTest
return response["data"]["testId"]
AttributeError: addinfourl instance has no attribute '__getitem__'

我在这里做错了什么。我需要一种方法来关闭连接,如果发生了不好的事情,或者我已经完成了它。

1 个答案:

答案 0 :(得分:0)

我在这里做错了什么?
发生了一个未被捕获的错误。

发生错误的原因是:引自@Nonnib:

  

json.load返回您需要的对象。您可能正在寻找:   response_dict = json.load(响应)然后返回   response_dict [&#34;数据&#34;] [&#34; testId&#34;]

可能的解决方案:
捕获可能的错误并返回适当的结果

def submitTest(self,url):
    response = None
    if url is not None:
        wptUrl = WebPageTestConfigUtils.getConfigValue('runTestURL')+"?f=json&url="+url+"&runs=3&video=1&web10=0&fvonly=1&mv=1&private=1&location=us_east_wptdriver:Chrome.DSL"
        with closing(urllib.urlopen(wptUrl)) as response:
            json.load(response)
            try:
                return response["data"]["testId"]
            except AttributeError:
                return "an AttributeError occured" # or return something else, up to you
            except:
                return "an error occured" 

这样,with块将始终正常执行并在完成后关闭连接