我有一个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
的任何其他关键字?
答案 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