2011-04-19 5 views
11

isinstance(SystemExit(1), Exception) evals a Es cierto, pero este fragmento imprime "caught by bare except SystemExit(1,)".¿Por qué "except Exception" no captura SystemExit?

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

Mi entorno de prueba es Python 2.6.

+0

¿Realmente comprobar su estado de "' isinstance (SystemExit (1), Excepción) 'evals a True" en Python 2.6? – Anthon

Respuesta

13

isinstance(SystemExit(1), Exception) es False en Python 2.6. La jerarquía de excepciones en esta versión de Python se modificó desde Python 2.4.

E.g. KeyboardInterrupt ya no es la subclase de Exception.

Ver más información http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy

+4

PEP 352 proporciona la razón de ser: http://www.python.org/dev/peps/pep-0352/#exception-hierarchy-changes – ncoghlan

+0

Ah, y GeneratorExit fue trasladado posteriormente en 2.6 para heredar directamente de BaseException ya que es una excepción "-de salir del sistema" en algunos estilos de programación basada en generador. – ncoghlan

8

Su error está en la primera frase de su pregunta:

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

SystemExit no es una subclase de Exception.

+2

Gracias, he encontrado el error real es en Python 2.3, 'isinstance (SystemExit (1), Excepción)' es verdadera. Y con Python 2.3, el código de prueba imprime '" atrapado por excepción Excepto "'. Para Python 2.6, esto es correcto. –

Cuestiones relacionadas