修改异常消息而不会因引发而丢失堆栈

时间:2019-01-09 00:22:53

标签: python python-3.x exception

我有一个try/except子句,它将返回或捕获一个KeyError,如下所示:

try:
    return super().__new__(globals()[kls])
except KeyError:
    raise

如果使用不当,将生成堆栈跟踪:

>>> g = Grid(cell='Circle')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    g = Grid(cell='Circle')
  File "<pyshell#1>", line 8, in __new__
    return super().__new__(globals()[kls])
KeyError: 'SHPCircleGrid'
>>> g
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    g
NameError: name 'g' is not defined

那很好,但是我想“扩展/修改”消息以向用户解释如何再次避免此错误;即来自:

KeyError: 'SHPCircleGrid'

KeyError: 'SHPCircleGrid'. Use 'Hex', 'Rect' or 'Tri' for cell keyword.

在为用户维护堆栈时。捕获部分中的通用print()g设置为NoneType,我不希望这样做,因此简单地打印并不是解决这个问题的方法。添加另一个raise KeyError('some message')会打印两个堆栈(“同时正在处理另一个异常……”消息),这也是不希望的。

有什么合适的方法来处理此问题,以便可以将其扩展到类实例化可能为之抛出KeyError的任何其他关键字?

1 个答案:

答案 0 :(得分:0)

您不能仅通过向KeyError提供这样的消息来实现这一目标:

try:
    return super().__new__(globals()[kls])
except KeyError as e:
    key = "'{}'".format(*e.args)
    base = "{}. Use 'Hex', 'Rect' or 'Tri' for cell keyword."
    raise KeyError(base.format(key)) from None