11
votes

Pourquoi "sauf exception" ne pas attraper SystemExit?

isinstance (SystemExit (1), exception) code> Evals to true, mais cet extrait d'impression "attrapé par nage sauf SystemExit (1,)" code>.

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])


1 commentaires

Avez-vous vérifié votre déclaration " isinstance (SystemExit (1), exception) Evals à True" sur Python 2.6?


3 Réponses :


8
votes

Votre erreur est dans la première phrase de votre question: xxx

systemexit n'est pas une sous-classe de exception .


1 commentaires

Merci, j'ai trouvé l'erreur réelle, est dans Python 2.3, isinstance (SystemExit (1), exception) est vrai. Et avec Python 2.3, le code de test imprime "capturé par exception" . Pour Python 2.6, c'est correct.



11
votes

SystemExit dérive de Busseexception directement plutôt que de l'exception .

exception est le parent "Tous intégré , exceptions de sortie non-système "

SystemExit est une "exception de sortie du système" (par définition) et ne dérive donc pas de exception . Dans votre exemple, si vous avez utilisé BASSEEEXception , cela fonctionnerait selon vos hypothèses d'origine.


0 commentaires

13
votes

isinstance (systemexit (1), exception) est faux sur python 2.6. La hiérarchie des exceptions dans cette version de Python a été modifiée depuis Python 2.4.

E.g. KeyboardInterrupt n'est pas la sous-classe de Exception plus.

Voir plus d'infos http: //docs.python .org / version / 2.6.6 / Bibliothèque / Exceptions.HTML # Exception-hiérarchie


2 commentaires

Pep 352 fournit la justification: python.org/dev/peps / Pep-0352 / # EXCEPTION-Hiérarchie-modifications


Oh, et generatorexit ont ensuite été déplacés vers 2,6 pour hériter directement de BaseException, car il s'agit d'une exception "System-sortant" dans certains styles de programmation basée sur les générateurs.