11 Stimmen

Warum fängt "except Exception" SystemExit nicht ab?

isinstance(SystemExit(1), Exception) evaluiert zu True, aber dieser Abschnitt druckt "caught by bare except SystemExit(1,)".

try:
    sys.exit(0)
except Exception, e:
    print 'caught by except Exception', str(e)
except:
    print 'caught by bare except', repr(sys.exc_info()[1])

Meine Testumgebung ist Python 2.6.

13voto

Roman Bodnarchuk Punkte 27769

isinstance(SystemExit(1), Exception) ist auf Python 2.6 falsch. Die Ausnahme-Hierarchie in dieser Version von Python wurde seit Python 2.4 geändert.

Zum Beispiel ist KeyboardInterrupt nicht mehr eine Unterklasse von Exception.

Weitere Informationen finden Sie unter http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy

11voto

Noufal Ibrahim Punkte 68934

SystemExit leitet sich direkt von BaseException ab, anstatt von Exception.

Exception ist das übergeordnete "Alle integrierten, nicht systembeendenden Ausnahmen"

SystemExit ist eine "System beendende Ausnahme" (per Definition) und leitet daher nicht von Exception ab. In Ihrem Beispiel würde es, wenn Sie BaseException verwenden würden, gemäß Ihren ursprünglichen Annahmen funktionieren.

8voto

Sven Marnach Punkte 525472

Ihr Fehler liegt im allerersten Satz Ihrer Frage:

>>> isinstance(SystemExit(1), Exception)
False

SystemExit ist keine Unterklasse von Exception.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X