所以我基本上必须通过例外将两层应用程序隔离开来。
我有这个WLST 12c脚本(python 2.2),就像
try:
something something...
except java.lang.UnsuportedOpperationException, (a, b):
pass
except java.lang.reflect.UndeclaredThrowableException, (a, b):
pass
我希望能够重新提出我自己的一种异常,其中包含有关导致前一异常的原因的消息(不,我不知道a
和{ {1}}参数是,但我猜其中一个应该是异常描述。)
我自己就是一个java人,所以我很期待像
这样的东西b
答案 0 :(得分:30)
虽然这是一篇旧文章,但对原始问题有一个更为简单的答案。要在捕获异常后重新抛出异常,只需使用不带参数的“raise”。将保留原始堆栈跟踪。
答案 1 :(得分: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')
。
希望有所帮助:)
答案 2 :(得分:1)
成语
try:
...
except SomeException:
...
raise
@normaldotcom提到的会重新引发已捕获的错误,而无需进行任何修改。它不会对OP发出 not 答复,“ 如何创建一个新的异常,其中包含有关已捕获的异常的信息”。
实际上,在某些情况下,我们想创建一个新的异常,通常是将内部错误的许多可能来源重组为一个更清晰的消息的单个异常,同时仍保持对原始错误的追溯以启用调试。
>一种实现此目标的方法是通过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)
答案 3 :(得分:1)
在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
答案 4 :(得分: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,然后在您引发它时将其传递给您自己的异常。