为什么我的变量值没有传递给python中的finally块

时间:2016-07-08 03:31:10

标签: python python-2.7 exception httplib

这是针对python 2.7.10的 也许我没有使用try..except..finally正确阻止。

我需要查看从网页上获得的HTTP响应代码。 如果我得到200代码,一切正常。如果我得到任何其他代码,请报告代码。

如果我获得200个HTTP代码,它可以正常工作。 如果我得到一个异常,由于某种原因,它给了我一个UnboundedLocalError,说明我的变量没有被引用。如何在finally块中识别我的变量?

这是我的代码:

try:
   conn = httplib.HTTPConnection(host, port=9000)
   conn.request("GET", "/alive")
   resp = conn.getresponse().status
except Exception as e:
   print "got some exception"
   print "exception " + e 
   print "Exception msg: " + e.message
   print "Args for exception: " + e.args
finally:
   if resp == 200:
      print "got a 200 http response.  everything seems good"
   if resp != 200:
      print "didn't get a 200 http response.  something wrong"
   print "this is the code we got: " + str(resp)

如果它与http 200代码一起使用,这是我们得到的输出:

got a 200 http response.  everything seems good this is the code we got: 200

这是我们获得的输出,如果它得到异常

got some exception
Traceback (most recent call last):
  File "monitorAlive.py", line 27, in <module>
    main()
  File "monitorAlive.py", line 24, in main
    get_status_code(host)
  File "monitorAlive.py", line 16, in get_status_code
    if resp == 200:
UnboundLocalError: local variable 'resp' referenced before assignment

编辑:如果我等了5分钟,然后点击网站出现问题,那么我会得到响应代码/正确的输出。这里可能有第二个问题,为什么网站花了这么长时间才能返回http 500代码(工作5分钟)。

2 个答案:

答案 0 :(得分:8)

如果发生异常,那么赋值语句(resp = conn.getresponse().status)永远不会运行或永远不会结束。 1 在这种情况下,当finally子句运行时,你&# 39; ll会收到错误,因为resp从未设置为任何内容。

根据用途,看起来对我来说就像你想使用else而不是finally一样。 finally无论如何都会运行,但只有在else套件没有例外的情况下完成时才会运行try

1 考虑conn.getresponse中发生的异常 - 由于引发了异常,conn.getresponse永远不会返回所有内容没有值绑定到左侧的resp

答案 1 :(得分:1)

解决方案是在“try”子句之前将“无”分配给“resp”。如下所示。

resp = None
try:

当你运行conn.request(“GET”,“/ alive”)时,如果超时,这可能会导致异常,那么你的代码将输入“except”,然后是“finally”子句。但是变量没有分配,所以它出错了。