2012-05-11 118 views
13

所以我基本上必须通过例外来隔离2层应用程序。如何重新抛出包含有关原始异常信息的异常?

我有这样的WLST 12C脚本(蟒蛇2.2),即是这样

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

我希望能够再提高我自己的异常类型中的一种,包含有关消息是什么导致了以前的例外(不,我不知道ab参数是什么,但我猜他们中的一个应该是例外描述)。

我是一个Java的家伙自己,所以我很期待像

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

为什么你正在使用Python 2.2?最新的2.2版本是2003年。目前还没有发布它的当前版本,据我所知... – Daenyth

+0

实际上它看起来像是使用了一个'Jython'解释器,它可能在版本方面落后于CPython数字 –

回答

9

我希望我得到了问题的权利。

我不知道关于Python 2.2的细节,但this说,你可以处理异常的同样的方式在最近的版本做:

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

或者,也许最后一行应该是raise ExceptionToThrow(str(e))。这取决于你的异常是如何定义的。例如:

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

这提高了ValueError('foo')

希望它能帮助:)

+1

没有str()的方法是最好的;请参阅http://www.python.org/dev/peps/pep-3134/。另外@ vlad-ardelean:你可以使用ExceptionToThrow e .__ cause__来获取ErrorToCatch – Riking

+2

请注意,这会丢弃有关原始异常发生的位置的信息,但这听起来像OP所要求的。 – 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") 

您可以提取原始异常,在这里势必E资料,然后传递到自己的异常,当你提出。

+0

请注意,multicatch必须是指定类型的最后一个except语句 – Riking

29

虽然这是一个旧帖子,但对原始问题有一个更简单的答案。捕捉它后重新抛出一个异常,只需使用“raise”而不带任何参数。原始堆栈跟踪将被保留。

+0

这是正确的答案。 –