这是针对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分钟)。
答案 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”子句。但是变量没有分配,所以它出错了。