Python尝试除了最后

时间:2010-12-18 08:38:34

标签: python web2py try-catch-finally

看起来我还没有处理异常处理的问题。我不知所措:( 以下代码有时会返回此错误:

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
...

谢谢,HC

2 个答案:

答案 0 :(得分:9)

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

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而不是其他类型的异常。

答案 1 :(得分:3)

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

status = None
try: 
    # etc

然后状态将始终受到约束。这不会解决任何未处理的异常的问题,但它将解决UnboundLocalError。

(此外,在第一个块中,您使用e.message来确定状态,在下面的块中,您只使用完整的错误e,而不仅仅是消息。)