2009-05-15 27 views
2
import sys 
try: 
    raise "xxx" 
except str,e: 
    print "1",e 
except: 
    print "2",sys.exc_type,sys.exc_value 

In dem obigen Code wird eine String-Ausnahme ausgelöst, die zwar veraltet ist, aber immer noch eine 3rd-Party-Bibliothek verwendet, die ich verwende. Also wie kann ich solche Ausnahme fangen, ohne auf alle zu verlassen, die schlecht sein könnten.Wie str Ausnahme zu fangen?

außer str, e: fängt es nicht? Warum?

System: Python 2.5.2 (R252: 60911, 31 Jul 2008, 17.28.52) [4.2.3 GCC (Ubuntu 4.2.3-2ubuntu7)] auf linux2

Antwort

4

ist die Lösung von python mailing list, nicht sehr elegant aber funktioniert, wenn nicht die Notwendigkeit vermeiden kann für solche Hack

import sys 
try: 
    raise "a string exception" 
except: 
    e, t, tb = sys.exc_info() 
    if not isinstance(e, str): 
      raise  
    print "caught", e 
2
try: 
    raise "xxx" 

except "xxx": 
    print "xxx caught" 

except <class> funktioniert nur mit Klassen, die eine Unterklasse von Exception sind, denke ich. Oh btw, verwenden Sie basestring bei der Überprüfung der Art der Zeichenfolgen, arbeitet auch mit Unicode-Zeichenfolgen.

+0

basestring Vorschlag ein guter in der Regel dank –

+0

ich nicht fangen kann " xxx "weil ich nicht weiß, was die Ausnahme von 3rd Party lib in echtem Code sein wird –

6

Die generische except:-Klausel ist die einzige Möglichkeit, alle str-Ausnahmen zu erfassen.

str Ausnahmen sind eine ältere Python-Funktion. Im neuen Code sollten Sie raise Exception("xxx") verwenden oder Ihre eigene Exception-Unterklasse oder assert 0, "xxx" erstellen.

+5

+1: Benutze niemals String-Ausnahmen. Noch nie. –

+0

aber was können Sie über die dritte Teilbibliothek tun? –

+0

Finden Sie eine bessere Bibliothek von Drittanbietern. ODER. Repariere es. Du hast die Quelle. Sie können die Quelle ändern. Einfach reparieren. –

2

Das Erhöhen roher Strings ist einfach falsch. Es ist eine veraltete Eigenschaft (und sollte daher Warnungen ausgelöst haben). Das Abfangen der expliziten Zeichenfolge funktioniert, wenn Sie es wirklich brauchen, und so wird alles abgefangen. Da alles abzufangen die Hässlichkeit in Ihre Code, empfehle ich, die Zeichenfolge explizit oder noch besser fangen: Reparieren der defekten Bibliothek.

try: 
    #code_that_throws_string() 
    raise("spam") 
except "spam": 
    pass 

Die Pass-Anweisung wird erreicht. Es gibt viele gute Gründe, keine Strings als Ausnahmen zu verwenden, und das ist einer von ihnen (der andere ist: Ich glaube nicht, dass Sie Tracebacks bekommen können, so dass sie für die Fehlerbehebung praktisch nutzlos sind).

Also, reparieren Sie die Bibliothek (gut). Oder fangen Sie die Zeichenfolge explizit ab (schlecht). Oder fang alles ab (sehr schlecht) und teste einigeInstance (e, str) (noch schlimmer). Hier

Verwandte Themen