Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最后尝试一下_Python_Web2py_Try Catch Finally - Fatal编程技术网

Python 最后尝试一下

Python 最后尝试一下,python,web2py,try-catch-finally,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总是被分配一个值。

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

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
)而
最终将其掩盖了吗

...
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
...
。。。
尝试:
服务器\u url=self.\u获取\u pingback\u服务器(目标)
除PingbackClientError外,e:
状态=电子邮件
其他:
尝试:
server=xmlrpclib.ServerProxy(服务器url)
状态=server.pingback.ping(self.source,target)
除xmlrpclib.Fault外,e:
状态=e
最后:

db(table.id==id)。update(status=status)#您的代码并不总是将某些内容分配给status。我可以看到一些不分配status的方法,我在下面突出显示了它们:

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)
试试看:
服务器\u url=self.\u获取\u pingback\u服务器(目标)
除PingbackClientError外,e:
#如果评估“e.message”引发异常,则不会设置状态。

status=e.message#作为一个简单的解决方案,我将在任何块之外初始化状态:

status = None
try: 
    # etc
然后状态将始终被绑定。这不会解决任何未处理异常的问题,但会解决UnboundLocalError


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

谢谢标记。因此,如果try块自身失败,finally有效地隐藏了try块中其他地方引发的任何未捕获异常,因为它的块始终被执行?“隐藏”在这个意义上,临时拦截它,然后仅当finally块没有自己的异常要引发时才转发它。