Reasignar la excepción desde dentro de un bloque __exit__ de python

Desde dentro de un bloque __exit__ en una clase de cursor personalizado, quiero capturar una excepción para que a su vez pueda lanzar una excepción más específica. ¿Cuál es la forma apropiada de hacer esto?

 class Cursor: def __enter__(self): ... def __exit__(self, ex_type, ex_val, tb): if ex_type == VagueThirdPartyError: # get new more specific error based on error code in ex_val and # return that one in its place. return False # ? else: return False 

Aumentar la excepción específica dentro del bloque __exit__ parece un hack, pero tal vez lo estoy pensando demasiado.

El procedimiento adecuado es generar la nueva excepción dentro del controlador __exit__ .

No debes levantar la excepción que se pasó sin embargo; para permitir el encadenamiento del administrador de contexto, en ese caso, simplemente debe devolver un valor falsey desde el controlador. Sin embargo, elevar sus propias excepciones está perfectamente bien.

Tenga en cuenta que es mejor usar la prueba de identidad para verificar el tipo de excepción aprobada:

 def __exit__(self, ex_type, ex_val, tb): if ex_type is VagueThirdPartyError: if ex_val.args[0] == 'foobar': raise SpecificException('Foobarred!') # Not raising a new exception, but surpressing the current one: if ex_val.args[0] == 'eggs-and-ham': # ignore this exception return True if ex_val.args[0] == 'baz': # re-raise this exception return False # No else required, the function exits and `None` is returned 

También puede usar issubclass(ex_type, VagueThirdPartyError) para permitir subclases de la excepción específica.