【问题标题】:Python try except finallyPython尝试除了finally
【发布时间】:2010-12-18 08:38:33
【问题描述】:

看起来我还没有掌握异常处理的窍门。我很茫然:( 以下代码有时会返回此错误:

File "applications/pingback/modules/plugin_h_pingback.py", line 190, in ping
    db(table.id==id_).update(status=status)
UnboundLocalError: local variable 'status' referenced before assignment

我希望status 总是被分配一个值。会不会是其他一些异常被抛出(可能在内部try)并且finally 掩盖了它?

...
try:
    server_url = self._get_pingback_server(target)
except PingbackClientError, e:
    status = e.message
else:
    try:
        server = xmlrpclib.ServerProxy(server_url)
        status = server.pingback.ping(self.source, target)
    except xmlrpclib.Fault, e:
        status = e
finally:
    db(table.id==id_).update(status=status) # <-- UnboundLocalError
...

谢谢,慧聪

【问题讨论】:

    标签: python web2py try-catch-finally


    【解决方案1】:

    您的代码并不总是将某些内容分配给状态。我可以看到一些可能无法分配状态的方式,我在下面突出显示了它们:

    try:
        server_url = self._get_pingback_server(target)
    except PingbackClientError, e:
        # If evaluating `e.message` raises an exception then status is not set.
        status = e.message  # <--- here
    else:
        try:
            # If either of these two lines fails with something other than
            # xmlrcplib.Fault, then status is not set.
            server = xmlrpclib.ServerProxy(server_url)             # <--- here
            status = server.pingback.ping(self.source, target)     # <--- here
        # If xmlrpclib.Fault is not defined status is not set.
        except xmlrpclib.Fault, e:                                 # <--- here
            status = e
    finally:
        db(table.id==id_).update(status=status)
    

    我怀疑错误最有可能发生在内部 try 块中,您只捕获 xmlrpclib.Fault 而不是其他类型的异常。

    【讨论】:

    • 谢谢马克。所以 finally 有效地隐藏了 try 块中其他地方引发的任何未捕获的异常,如果它本身失败,因为它的块总是被执行?
    • “隐藏”是指暂时拦截它,然后仅在 finally 块没有自己的异常要引发时转发它。
    【解决方案2】:

    作为一个简单的解决方案,我会在任何块之外初始化状态:

    status = None
    try: 
        # etc
    

    那么状态将永远被绑定。这不会解决任何未处理异常的问题,但会解决 UnboundLocalError。

    (另外,在第一个块中,您使用 e.message 评估状态,在接下来的块中,您只需使用完整的错误 e,而不仅仅是消息。)

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 2014-03-29
      • 2019-08-13
      • 2019-01-29
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多