2012-05-11 9 views
13

Quindi, in pratica, devo isolare 2 livelli dell'applicazione l'uno dall'altro per eccezioni.Come faccio a rilanciare un'eccezione che contiene informazioni su un'eccezione originale?

devo questo script WLST 12c (Python 2.2), che va come

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

Mi piacerebbe essere in grado di ri-sollevare una delle mie tipi di eccezione, che contiene un messaggio circa che ha causato l'eccezione precedente (e no, non so quali siano i parametri a e b, ma suppongo che uno di essi debba essere la descrizione dell'eccezione).

Sono un ragazzo java me stesso, quindi non vedo l'ora di qualcosa di simile a

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

Perché esattamente stai usando python 2.2? La versione 2.2 più recente è stata la 2003. Non ci sono distribuzioni attuali che la distribuiscano per la loro versione attuale, per quanto ne so ... – Daenyth

+0

che sembra che stia usando un interprete 'Jython' che potrebbe essere dietro a CPython in termini di versione numeri –

risposta

9

Spero ho ottenuto la domanda giusta.

io non sono sicuro di Python 2.2 dettagli, ma this dice che si può gestire le eccezioni allo stesso modo in cui è fatto nelle versioni più recenti:

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

O forse l'ultima riga dovrebbe essere raise ExceptionToThrow(str(e)). Dipende da come viene definita la tua eccezione. Esempio:

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

Questo solleva ValueError('foo').

Speranza che aiuta :)

+1

Il metodo senza str() è il migliore; vedi http://www.python.org/dev/peps/pep-3134/. Inoltre @ vlad-ardelean: puoi usare ExceptionToThrow e .__ causa__ per ottenere ErrorToCatch – Riking

+2

Nota che questo ignora le informazioni su dove si è verificata l'eccezione originale, ma suona come l'OP sta chiedendo. – 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") 

è possibile estrarre informazioni dal eccezione originale, che qui è destinato a posta, e poi passare che al proprio un'eccezione quando si sollevano esso.

+0

Nota che multicatch DEVE essere l'ultima istruzione tranne che specifica i tipi – Riking

29

Anche se questo è un vecchio post, c'è una risposta molto più semplice alla domanda originale. Per rilanciare un'eccezione dopo averla catturata, usa "raise" senza argomenti. La traccia dello stack originale verrà mantenuta.

+0

Questa è la risposta corretta. –

Problemi correlati