2010-12-18 10 views
4

私はまだ例外処理のハングアップを持っていないようです。私は途方に暮れてよ:( 次のコードは、時々、このエラーが返されます。Python try finally except

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

答えて

9

あなたのコードは、常に状況に何かを割り当てることはありません。私は、ステータスが割り当てではないかもしれないいくつかの方法を見ることができます私はエラーの最も可能性の高い場所はあなたが唯一の例外のxmlrpclib.Faultではなく、他の種類をキャッチされ、内側のtryブロックであることを疑う

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) 

:エドと私は下にそれらを強調しました。簡単な解決策として

+0

おかげマーク。したがって、ブロックが常に実行されるため、失敗した場合はtryブロックのどこか他の場所で発生したキャッチされていない例外を効果的に隠すことができますか? – hcvst

+2

「隠す」は一時的に傍受し、最終的にブロックが独自の例外を除外しない場合にのみ転送します。 –

3

、私は、任意のブロックの外のステータスを初期化したい:

status = None 
try: 
    # etc 

は、その後の状態は常にバインドされます。未処理の例外の問題は解決されませんが、UnboundLocalErrorは解決されます。

(また、最初のブロックあなたがe.messageと状況をASSINGで、次のブロックでは、あなただけの完全な誤差eだけでなく、メッセージを使用しています。)

関連する問題