2010-12-18 5 views
4

Es sieht so aus, als ob ich noch nicht ganz den Ausnahmebehandlungsfall habe. Ich ratlos bin :( Der folgende Code gibt manchmal diese Fehlermeldung:.Python versuchen, außer endlich

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 

Ich würde erwarten, status immer ein Wert zugewiesen worden Könnte es sein, dass eine andere Ausnahme ausgelöst wird (vielleicht in der Innen try) und die finally verschleiern es?

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

Danke, HC

Antwort

9

Ihr Code nicht immer etwas zu Status zuweisen. ich habe ein paar Möglichkeiten sehen, die den Status nicht assign sein könnte ed und ich habe sie unten hervorgehoben:

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) 

ich, dass der wahrscheinlichste Ort für den Fehler vermuten, in der inneren try-Block ist, wo man nur xmlrpclib.Fault und nicht andere Arten von Ausnahmen zu kontrollieren.

+0

Dank Mark. Also verbirgt die Datei schließlich alle nicht abgefangenen Exceptions, die an anderer Stelle im try-Block ausgelöst werden, wenn sie selbst fehlschlagen, weil ihr Block immer ausgeführt wird? – hcvst

+2

"Versteckt" in dem Sinne, dass es es vorübergehend abfängt und es nur dann weiterleitet, wenn der finally-Block keine eigene Ausnahme zum Erhöhen hat. –

3

Als einfache Lösung, würde ich Status außerhalb von Blöcken initialisieren:

status = None 
try: 
    # etc 

Dann Status wird immer gebunden sein. Das wird das Problem einer nicht behandelten Ausnahme nicht lösen, aber es wird den UnboundLocalError lösen.

(Auch Sie im ersten Block mit e.message, in dem folgenden Block assing Status, verwenden Sie einfach den kompletten Fehler e, nicht nur die Nachricht.)