在使用标准异常类型时在Python中使用特定异常

时间:2017-12-19 19:18:42

标签: python exception-handling

背景:我对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

正确的方法是什么?

0 个答案:

没有答案