2012-05-11 11 views
13

Así que, básicamente, tengo que aislar 2 capas de la aplicación el uno del otro por excepciones.¿Cómo puedo volver a lanzar una excepción que contiene información sobre una excepción original?

tengo este script WLST 12c (Python 2.2), que dice así

try: 
    something something... 
except java.lang.UnsuportedOpperationException, (a, b): 
    pass 
except java.lang.reflect.UndeclaredThrowableException, (a, b): 
    pass 

Me gustaría ser capaz de volver a subir a uno de mis propios tipos de excepción, que contiene un mensaje acerca de lo causó la excepción anterior (y no, no sé cuáles son los parámetros a y b, pero supongo que uno de ellos debería ser la descripción de excepción).

Soy un tipo java mí mismo, así que estoy deseando algo así como

try { 
    something something... 
} catch (Exception e) { 
    throw new RuntimeException(e, "something horrible happened"); 
} 
+0

¿Por qué exactamente estás usando Python 2.2? La versión 2.2 más reciente fue 2003. No hay distribuciones actuales que envíen esa versión actual hasta donde yo sepa ... – Daenyth

+0

que en realidad parece que está usando un intérprete 'Jython' que puede estar detrás de CPython en términos de versión números –

Respuesta

9

espero que me dieron la pregunta correcta.

No estoy seguro acerca de Python 2.2 detalles, pero this dice que usted puede controlar las excepciones de la misma manera que se hace en las versiones más recientes:

try: 
    do_stuff() 
except ErrorToCatch, e: 
    raise ExceptionToThrow(e) 

O tal vez la última línea debe ser raise ExceptionToThrow(str(e)). Eso depende de cómo esté definida su excepción. Ejemplo:

try: 
    raise TypeError('foo') 
except TypeError, t: 
    raise ValueError(t) 

Esto aumenta ValueError('foo').

espero que ayude :)

+1

El método sin str() es el mejor; ver http://www.python.org/dev/peps/pep-3134/. También @ vlad-ardelean: puede usar ExceptionToThrow e .__ cause__ para obtener el ErrorToCatch – Riking

+2

Tenga en cuenta que esto descarta la información sobre dónde se produjo la excepción original, pero que suena como lo que el OP está pidiendo. – jrennie

0
class MyException(Exception): pass 

... 

try: 
    my_funcion(my_args) 
except (IOError, KeyError, some_list_of_other_possible_exceptions), e: 
    raise MyException("Uh oh") 

Usted puede extraer información de la excepción original, que aquí está obligado a E y, a continuación, pasar eso a su propio excepción cuando se la levanta.

+0

Tenga en cuenta que multicatch DEBE ser la última instrucción excepto que especifica los tipos – Riking

29

Aunque esta es una publicación anterior, hay una respuesta mucho más simple a la pregunta original. Para volver a lanzar una excepción después de atraparla, simplemente use "raise" sin argumentos. La traza original de la pila se conservará.

+0

Esta es la respuesta correcta. –

Cuestiones relacionadas