4

私はまだ例外処理のこつを持っていないようです。私は途方に暮れています:(次のコードは時々このエラーを返します:

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

4

2 に答える 2

10

コードが常にステータスに何かを割り当てるとは限りません。ステータスが割り当てられない可能性のあるいくつかの方法を確認できます。以下でそれらを強調表示しました。

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)

エラーの可能性が最も高い場所は、xmlrpclib.Fault他のタイプの例外ではなく、キャッチしているだけの内側のtryブロックにあると思われます。

于 2010-12-18T08:45:53.130 に答える
3

簡単な解決策として、ブロックの外側でステータスを初期化します。

status = None
try: 
    # etc

その後、ステータスは常にバインドされます。これは未処理の例外の問題を解決しませんが、UnboundLocalError は解決します。

(また、最初のブロックでは e.message でステータスを割り当て、次のブロックではメッセージだけでなく完全なエラー e を使用します。)

于 2010-12-18T09:01:26.927 に答える