【发布时间】:2013-05-01 03:40:02
【问题描述】:
是否有在 Python 中使用异常链的标准方法?就像“由”引起的 Java 异常?
这里有一些背景。
我有一个带有一个主要异常类 DSError 的模块:
class DSError(Exception):
pass
在这个模块的某个地方会有:
try:
v = my_dict[k]
something(v)
except KeyError as e:
raise DSError("no key %s found for %s" % (k, self))
except ValueError as e:
raise DSError("Bad Value %s found for %s" % (v, self))
except DSError as e:
raise DSError("%s raised in %s" % (e, self))
基本上这个 sn-p 应该只抛出 DSError 并告诉我发生了什么以及为什么。问题是 try 块可能会抛出许多其他异常,所以如果我可以执行以下操作,我会更喜欢:
try:
v = my_dict[k]
something(v)
except Exception as e:
raise DSError(self, v, e) # Exception chained...
这是标准的pythonic方式吗?我没有在其他模块中看到异常链,那么在 Python 中是如何完成的?
【问题讨论】:
-
您希望输出是什么?我不知道您是否真的想要原始异常的堆栈跟踪,或者您是否想隐藏它并且只使用一条总结原始异常的消息来拥有自己的异常?
-
原始跟踪会好很多,因为可以从模块递归调用 try 块。
标签: python exception coding-style python-2.x