为什么我的变量值没有传递到 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 而不是 finallyfinally 无论如何都会 运行,但是 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变量没有赋值,所以出错了