背景:我对Python有些陌生,而且我在学习Python的同时用TDL编写了一个小roguelike。我试图制作东西" pythonic" (我的背景主要是在C#中)。
根据我的课件,有三件事是" pythonic":
try
/ except
并正确恢复在我游戏的主循环中,我有一个entities
的集合。我迭代它们,如果它们可以步行,请拨打walk
。我的代码看起来像这样:
for e in self.area_map.entities:
try:
e.walk()
except AttributeError:
# not walkable
pass
except ValueError:
# all adjacent tiles are not walkable
pass
我最近介绍了一个错误,其中我的一个实体引用了一个最终为None
的变量而不是一个值。我没有抓住这个错误,而是让我的实体根本不走路。
事实证明,我捕获的两个例外情况可能包括各种各样的异常;但是,我不想隐藏它们 - 我只想隐藏特定情况(方法不存在的情况,以及我的代码抛出ValueError
的情况)。
这样做的正确方法是什么?
目前,我正在检查异常消息是否是特定的,这对我来说很有趣(如果较新版本的Python略微调整异常消息会怎么样?)
我的代码现在看起来像这样:
for entity in self.area_map.entities:
try:
entity.walk()
except AttributeError as a:
# AttributeError => entity isn't walkable.
message = str(a)
if not "object has no attribute 'walk'" in message:
raise
except ValueError as v:
# ValueError => nothing adjacent to walk to.
message = str(v)
if message is not "There are no available adjacent locations":
raise
正确的方法是什么?