高级 Python 开发课程
第 章
>
第 级
异常处理
总结异常
目标
前往办公室,确保资金供给平衡,方法是使用 finally 代码块和 assert 关键字。
在二楼深处有一间专门用于存放农场未来投资资金的办公室。现在正是时候检查并确保所有账目都已平衡。在处理数字时,数学错误和其他问题难以避免,因此再次使用异常处理来捕获并解决错误是个不错的主意。
除了 try / except 和 else 代码块之外,还有 finally 代码块,它允许你在异常处理结束时执行收尾操作。另外,assert 关键字是一种调试功能,它允许你检查代码是否存在错误,从而修复有问题的代码。
首先,走向办公室门前那个明亮的 X 标记,使用 open() 函数打开门进入。进入后前往金色的 X 标记,并使用 collect() 函数收集两个不同的常量:categories 和 savings。categories 常量是一个列表,包含需要验证的三种资金供给,分别命名为:"exports"、"imports"、"stock"。savings 常量是一个变量,存储可能需要用来保证钱箱充足的资金供给。
现在所有必要的物品都已收集,是时候平衡存储在袋子中的资金了,这些袋子将由办事员在你完成后收集并分发。走向暗色 X 标记,这些标记位于 blue 地毯上,以及 blue、yellow 和 red 地毯上的 X 标记。在这里,我们将使用 categories 列表常量来验证每个袋子在装运前是否包含所有必要的组件。
每个袋子都应包含 categories 列表中列出的组件。对应每个袋子有三个字典常量:blue_sack、yellow_sack 和 red_sack。站在 blue 地毯上方的 X 标记处,运行一个 for 循环,验证袋子是否具备所有必需的材料,然后确认资金供给已全部核对。
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
某些袋子应当具备所有必需的材料,但像往常一样在这些练习中,你可能会遇到错误。如果遇到问题,你必须使用 try / except 代码块来捕获错误,此处的错误类型为 KeyError:,即当字典键不存在时发生的错误。当这种情况发生时,我们还会在异常处理中添加 finally 块,该块会在每个异常处理结束时始终执行一段代码。与其他异常不同,每个 try 只能有一个 finally 块。例如,对于 blue_sack:
try: for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) except: player.speak("Bag is missing %s, adding now" % (categories[x])) player.place(categories[x]) finally: player.speak("All assets accounted for")
在 yellow 和 red 地毯上的暗色 X 标记处,重复上述过程,分别使用 yellow_sack 和 red_sack 字典常量。在某些情况下可能不需要这样做,因为错误仅会在袋子中缺失项目时发生。
袋子验证完成后,现在是时候转向位于 green、purple 和 orange 地毯前的箱子了。在这里,我们必须确保每个箱子中的资金供给恰好为 30,然后再关闭箱子。每个箱子对应有三个变量常量,分别为:green_chest、purple_chest 和 orange_chest。
验证箱子时最大的问题在于我们不知道其确切内容;当你处理未知的数值时,可以使用 assert 关键字。该关键字允许你验证所声明的语句是真还是假,这对于检查代码中是否存在错误非常有用。assert 关键字通常与 try、except、else 和 final 及其各种组合方式一起使用,以修复存在错误的代码。例如,对于 green_chest:
try: assert(green_chest = 30) except AssertionError: player.speak("Chest is not full %s/30" % green_chest) drop = 30-green_chest savings -= drop player.place(drop) else: player.speak("All assets accounted for") finally: player.close()
在上述代码中,我们使用 assert 关键字验证 green_chest 是否包含正确数量的资金供给。如果数量不正确,则触发 except 块,我们会计算出缺失的资金数额,从 savings 变量中减去这个数额,并添加到箱子中。如果资金供给齐全,则触发 else 块,确认所有资产已到位。一切验证完毕后,执行 finally 块并调用 close() 函数关闭箱子。
在 green、purple 和 orange 地毯上的 X 标记处,面对箱子并分别使用 green_chest、purple_chest、orange_chest 进行验证。验证完成后,走向明亮的 X 标记处,并使用 place() 函数将剩余的 savings 变量存放到板条箱中,以完成该关卡。