Manejando todas menos una excepción

¿Cómo manejar todas las excepciones menos una?

try: something except : # handling 

Algo como esto, excepto sin destruir el rastro original:

 try: something except NoChildException: raise NoChildException except Exception: # handling 

La respuesta es simplemente hacer una raise desnuda:

 try: ... except NoChildException: # optionally, do some stuff here and then ... raise except Exception: # handling 

Esto volverá a elevar la última excepción lanzada, con el rastro de stack original intacto (¡incluso si se ha manejado!).

Ofrecería esto como una mejora en la respuesta aceptada.

 try: dosomestuff() except MySpecialException: ttype, value, traceback = sys.exc_info() raise ttype, value, traceback except Exception as e: mse = convert_to_myspecialexception_with_local_context(e, context) raise mse 

Este enfoque mejora la respuesta aceptada al mantener el seguimiento de stack original cuando se capta la excepción MySpecialException, de modo que cuando el controlador de excepciones de nivel superior registre la excepción, obtendrá un rastreo que indica dónde se lanzó la excepción original.

Encontré un contexto en el que capturar todos los errores, pero uno no es algo malo, es decir, la prueba unitaria.

Si tengo un método:

 def my_method(): try: something() except IOError, e: handle_it() 

Entonces podría tener una prueba unitaria que parezca:

 def test_my_method(): try: my_module.my_method() except IOError, e: print "shouldn't see this error message" assert False except Exception, e: print "some other error message" assert False assert True 

Porque ahora ha detectado que my_method acaba de lanzar una excepción inesperada.