15

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

我有这个 WLST 12c 脚本(python 2.2),就像

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

我希望能够重新引发我自己的一种异常类型,其中包含有关导致上一个异常的原因的消息(不,我不知道aandb参数是什么,但我猜一个其中应该是异常描述)。

我自己是一个java人,所以我期待着类似的东西

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

5 回答 5

32

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

于 2014-06-03T21:03:27.407 回答
9

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

我不确定 Python 2.2 的细节,但这说明你可以像在最近的版本中那样处理异常:

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').

希望能帮助到你 :)

于 2012-05-11T17:17:16.327 回答
4

成语

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

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

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

实现这一点的with_traceback一种方法BaseException是通过. 例如,

import sys

try:
  raise ValueError('internal error message')
except ValueError:
  tb = sys.exc_info()[2]
  raise Exception('new error message').with_traceback(tb)
于 2018-09-13T13:56:40.840 回答
4

我是 Python 3,raise from构造完全符合您的要求。它引发新异常,将原始异常保存在新异常的__cause__属性中。

见这里:https ://docs.python.org/3/reference/simple_stmts.html#the-raise-statement

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
于 2020-05-03T08:25:52.617 回答
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)中提取信息,然后在引发异常时将其传递给您自己的异常。

于 2012-05-11T17:21:46.853 回答