如何重新抛出包含原始异常信息的异常?

问题描述 投票:14回答:4

所以我基本上必须通过异常将两层应用程序隔离开来。

我有这个WLST 12c脚本(python 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");
}
python exception-handling wlst python-2.2
4个回答
8
投票

我希望我的问题是正确的。

我不确定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')

希望能帮助到你 :)


30
投票

虽然这是一篇旧文章,但对原始问题有一个更简单的答案。要在捕获异常后重新抛出异常,只需使用不带参数的“raise”。将保留原始堆栈跟踪。


1
投票

成语

try:
   ...
except SomeException:
   ...
   raise

@normaldotcom提到的重新抛出已经按原样捕获的错误,没有任何修改。它没有回答OP,“我如何创建一个新的异常,其中包含有关已捕获的异常的信息”。

实际上,在某些情况下,人们希望创建一个新的异常,通常是将许多可能的内部错误源重新组合成一个带有更清晰消息的异常,同时仍然保留回溯到原始错误以启用调试。

实现这一目标的方法是通过with_traceback method of BaseException。例如,

import sys

try:
  raise ValueError('internal error message')
except ValueError:
  tb = sys.exc_info()[2]
  raise Exception('new error message').with_traceback(tb)

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,然后在引发它时将其传递给您自己的异常。

© www.soinside.com 2019 - 2024. All rights reserved.