Generell sollte man nicht einfach einen Codeblock in try ... except packen und dann nur "Fehler" ausgeben.
Allgemeine Ratschläge:
except ohne Exceptionklasse nicht verwenden
- Nur gezielt bestimmte Fehler abfangen
Eigene Meldung ausgeben
Hier sind Varianten, wie man einigermaßen sinnvolle Ausgaben machen kann, auch wenn man alle Fehler abfängt:
1 try:
2 "...mach irgendwas..."
3 except Exception, e:
4 print "Error:", e
Einen kompletten Traceback kann man auch generieren lassen:
1 try:
2 "...mach irgendwas..."
3 except Exception, e:
4 import traceback
5 print traceback.format_exc()
Hinweis: Exception fängt nicht alles ab. Möchte man SystemExit, KeyboardInterrupt und GeneratorExit abfangen, müsste man BaseException benutzen. Siehe auch: Exception Hierarchie
Meldungstext erweitern
Die Traceback-Meldung mit eigenem Text erweitern, aber den Traceback dabei nicht abfangen:
1 try:
2 f = open("doesnotexist")
3 except:
4 etype, evalue, etb = sys.exc_info()
5 evalue = etype("Cannot open file: %s" % evalue)
6 raise etype, evalue, etb
Die Traceback-Meldung sieht dann ungefähr so aus:
Cannot open file: [Errno 2] No such file or directory: 'doesnotexist'
Siehe auch Python-Forum-Thread Exception Meldung erweitern...
gezielt Fehler abfangen
Gezielt eine Fehlerklasse abfangen, alle anderen führen zu einem Traceback:
1 try:
2 "...mach irgendwas..."
3 except KeyError, e:
4 print "Fehler: Key %s nicht in dict enthalten!" % e.message
Mehrere Fehler gleichzeitig abfangen:
1 try:
2 "...mach irgendwas..."
3 except (KeyError, TypeError), e:
4 print "Fehler:", e
5 else:
6 # Im try-Block sind keine Fehler aufgetreten
7 print "OK"
Nur bestimmte IO-Fehlernummer abfangen:
1 import sys, errno
2
3 try:
4 f = open("foo/bar.txt", "w")
5 except IOError, err:
6 if err.errno == errno.ENOENT: # No 2: No such file or directory
7 print "Bitte Verzeichnis erstellen!"
8 sys.exit()
9 else:
10 # Selbe Exception für alle anderen IOError-Fehler werfen
11 raise
Siehe auch: http://docs.python.org/library/errno.html
Links
Ian Bicking blog Eintrag zum Thema exceptions (mit vielen Beispielen)