高级 Python 开发课程
第 章
>
第 级
异常处理
多个异常
目标
使用多个异常处理来收集并正确地将一些医疗用品存放在箱子中。
屋顶的仓库需要补充储备,一些物资已被使用却从未替换过。在其中一个储藏室的备忘录里有一份更多材料的订单,最好能处理一下。也就是说,需要将各种不同的材料组合起来并存放在箱子中。
由于所需填充箱子的材料数据类型和数量不同,我们可能会遇到各种错误。我们可以使用 try / except 来捕获可能出现的错误并修正一些问题,但当一次操作中可能遇到多个错误时,该怎么办呢?为此我们可以指定捕获的异常类型并使用多个异常处理。
首先,走向标有金色 X 的位置,面向门,使用 open() 函数进入储藏室。一旦进入后,走向标有暗色 X 的位置,向右转以使用 read() 函数检查桌上的备忘录中订购的材料和数量。备忘录中写有列表常量的信息,包括供应品及其对应的订单。一旦完成,走向储藏室内标有浅色 X 的位置,转向箱子并使用 collect() 函数获取其中的 pads 列表常量,如下所示:player.collect(pads) 。
在储藏室内存放着 "peroxide" 和 "isopropyl",走过去将它们全部收集起来,然后走到外面,前往铺有紫色地毯的暗色 X 标记位置。在紫色地毯上,当面对箱子时,使用 collect() 函数抓取 "water bottle",接着前往铺有黄色地毯的暗色 X 标记位置,使用 collect() 函数抓取 "glass bottle"。
既然物品已被收集,现在该满足订单并将所有材料放入右侧储藏室的箱子中。为此,我们首先要将 "water bottle"、"peroxide" 和 "isopropyl" 存入一个名为 supplies 的列表中。在铺有 red 、green 和 blue 地毯的暗色 X 标记位置,我们将使用箱子来存放这些医疗用品。为此,我们将设置三个列表:blue_crate = []、green_crate = [] 和 red_crate = []。
在放置所有物品之前,我们必须先使用循环遍历这些列表并将它们合并为一个单一的列表,从而填充所有的材料。这将把所有 supplies 放入列表中,并根据储藏室备忘录中的 order 将 pads 项目的数量进行分配。
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
尽管如此,你会注意到仍会出现错误,尽管所有操作均正确,代码也无误。但问题在于,supplies 列表只有三个(3)项目,而循环运行了五(5)次,导致出现了 Index Error。同时,pads 列表不仅只有三个(3)项目,而且备忘录中的一个订单值为 0,任何数字除以 0 都会引发 Zero Division Error,因为按照数学原理没有数字能被 0 除。
这时,多重异常处理就派上用场了。我们使用 try / except 代码块捕获错误并允许程序继续运行。鉴于此操作中会出现两个错误,我们必须分别识别并捕获每个特定异常。这可以通过如下方式扩展 except 代码块来实现:except IndexError: 和 except ZeroDivisionError:。例如:
for x in range(5): try: blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x]) except IndexError: blue_crate.append("glass bottle") except ZeroDivisionError: blue_crate.append(0)
通过用 "glass bottle" 填补列表中的缺失位置,解决了 Index Error;而通过在非法操作发生时添加 0,解决了 Zero Division Error。
对 blue_crate = []、green_crate = [] 以及 red_crate = [] 列表重复此操作。走向铺有 blue、green 和 red 地毯的暗色 X 标记位置,使用 place() 函数将列表存放到相应的箱子中,以完成本关卡。