try...except Generell sollte man nicht einfach einen Codeblock in try ... except packen und dann nur "Fehler" ausgeben.

Allgemeine Ratschläge:

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, 
   4 try:
   5     "...mach irgendwas..."
   6 except Exception, e:
   7     import traceback
   8     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

Tags: Codesnippets

try...except (zuletzt geändert am 2014-08-19 14:34:43 durch anonym)