为什么我的变量值没有传递到 python 中的 finally 块
Why doesn't my variable value get passed to the finally block in python
这是 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 分钟,然后访问网站时出现问题,那么我会得到响应代码/正确的输出。这里可能还有第二个问题,即为什么网站要花这么长时间 return http 500 代码(5 分钟才能工作)。
如果发生异常,则赋值语句 (resp = conn.getresponse().status
) 永远不会 运行 或永远不会完成。1 在这种情况下,当finally
子句 运行s,您会收到错误消息,因为 resp
从未设置为任何内容。
根据用法,我觉得 您想使用 else
而不是 finally
。 finally
无论如何都会 运行,但是 else
只会 运行 如果 try
套件无一例外地完成。
1考虑在 conn.getresponse
中发生的异常 -- 由于异常被引发,conn.getresponse
从未 returns 任何东西,所以没有值绑定到左侧的 resp
。
解决方案是在下面的 "try" clause.Like 之前将 None 分配给 "resp"。
resp = None
try:
当你运行 conn.request("GET", "/alive")时,如果超时可能会抛出Exception,然后你的代码会进入"except"然后"finally" clause.But变量没有赋值,所以出错了
这是 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 分钟,然后访问网站时出现问题,那么我会得到响应代码/正确的输出。这里可能还有第二个问题,即为什么网站要花这么长时间 return http 500 代码(5 分钟才能工作)。
如果发生异常,则赋值语句 (resp = conn.getresponse().status
) 永远不会 运行 或永远不会完成。1 在这种情况下,当finally
子句 运行s,您会收到错误消息,因为 resp
从未设置为任何内容。
根据用法,我觉得 您想使用 else
而不是 finally
。 finally
无论如何都会 运行,但是 else
只会 运行 如果 try
套件无一例外地完成。
1考虑在 conn.getresponse
中发生的异常 -- 由于异常被引发,conn.getresponse
从未 returns 任何东西,所以没有值绑定到左侧的 resp
。
解决方案是在下面的 "try" clause.Like 之前将 None 分配给 "resp"。
resp = None
try:
当你运行 conn.request("GET", "/alive")时,如果超时可能会抛出Exception,然后你的代码会进入"except"然后"finally" clause.But变量没有赋值,所以出错了