2012-05-11 9 views
13

Also muss ich grundsätzlich zwei Schichten der Anwendung durch Ausnahmen voneinander isolieren.Wie wiederhole ich eine Ausnahme, die Informationen über eine ursprüngliche Ausnahme enthält?

ich diesen WLST 12c Skript (Python 2.2), das geht wie

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

Ich möchte in der Lage sein, eine meiner eigenen Arten von Ausnahmen neu zu erhöhen, die eine Nachricht über das enthält, was verursachte die vorherige Ausnahme (und nein, ich weiß nicht, was die a und b Parameter sind, aber ich rate, einer von ihnen sollte die Ausnahmebeschreibung sein).

Ich bin ein Java-Kerl mich, so dass ich freue mich auf so etwas wie

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

Warum genau verwenden Sie Python 2.2? Die letzte Version 2.2 war 2003. Es gibt keine aktuellen Distributionen, die das für ihre aktuelle Version liefern, soweit ich weiß ... – Daenyth

+0

, das tatsächlich so aussieht, als würde es einen 'Jython'-Interpreter verwenden, der in Bezug auf Version möglicherweise hinter CPython steht Zahlen –

Antwort

9

Ich hoffe, dass ich Recht die Frage bekam.

Ich bin nicht sicher über 2.2 Besonderheiten Python, aber this sagt man Ausnahme die gleiche Art und Weise umgehen kann es in neueren Versionen getan hat:

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

Oder vielleicht die letzte Zeile sollte raise ExceptionToThrow(str(e)) sein. Das hängt davon ab, wie Ihre Ausnahme definiert ist. Beispiel:

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

Dies löst ValueError('foo').

Hoffe, es hilft :)

+1

Die Methode ohne str() ist am besten; siehe http://www.python.org/dev/peps/pep-3134/. Auch @ vlad-ardelean: Sie können ExceptionToThrow e .__ cause__ verwenden, um die ErrorToCatch zu erhalten – Riking

+2

Beachten Sie, dass dies Informationen darüber, wo die ursprüngliche Ausnahme aufgetreten ist, verwirft, aber das klingt wie das, was das OP fragt. – 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") 

Sie Informationen aus der ursprünglichen Ausnahme extrahieren kann, die hier an e gebunden ist, und dann, dass zu Ihrer eigenen Ausnahme weitergeben, wenn Sie es anheben.

+0

Beachten Sie, dass Multicatch die letzte Ausnahmeanweisung sein muss, die Typen angibt – Riking

29

Obwohl dies ein alter Beitrag ist, gibt es eine viel einfachere Antwort auf die ursprüngliche Frage. Um eine Ausnahme nach dem Auffangen erneut auszulösen, verwenden Sie einfach "raise" ohne Argumente. Der ursprüngliche Stack-Trace wird beibehalten.

+0

Dies ist die richtige Antwort. –