高级 Python 开发课程
第 章
>
第 级
异常处理
自定义异常
目标
使用自定义异常来收集包含产品订单的消息,并通过信鸽发送出去。
有些消息通过使者鸽在农场和其他站点之间传递,提前发送几条消息可以帮助我们保持进度。我们一直使用常见异常来捕捉错误,但有时为非常具体的情境创建自己的自定义异常也会大有裨益。我们将通过使用自己定义的自定义异常来识别正确的项目,从而获取消息并选择合适的鸽子。
自定义异常是通过创建类来组合的,通过添加 (Exception) 子句,你可以重新用于执行异常处理。就我们的目的而言,我们将创建两个异常:
InvalidLocation:当特定字符串未通过验证时触发。UnsuitableSelection:用于检查数字是否超过某个阈值。
class InvalidLocation(Exception):
"Raised when location is invalid"
pass
class UnsuitableSelection(Exception):
"Raised when pidgeon is 2 or younger"
pass
现在类都设置好了,该去获取备忘录以便发送了。创建一个名为 prep 的列表,用来存储并组合即将交换所需的组件。走到红地毯上方那个暗色 X 标记处,在桌子前带有 X 标记的一串桌子上,我们将寻找标记为送往农场西部区域的备忘录。
这一部分使用了四个变量常量:red_memo、blue_memo、green_memo 和 orange_memo。只有那些标记为送往 "west" 区域的备忘录才会被收集,以便发送出去。为了确定是否收取备忘录,我们将结合 try/except 和 else 代码块以及 InvalidLocation 自定义异常来进行判断。具体做法是,在 try 块中检查备忘录是否标记为 "west",如果不是则抛出异常。except 块确认备忘录无效,而 else 块则在备忘录确实送往 "west" 区域时进行收集并将其追加到 prep 列表中。例如:
try: if red_memo != "west": raise InvalidLocation except InvalidLocation: player.speak("This is not an order that needs to be sent out") else: player.collect(red_memo) prep.append(red_memo)
走到每一个带有暗色 X 标记的彩色地毯前的桌子前,使用相应颜色对应的变量常量来运行异常处理流程。
收集完备忘录后,走到门前金色 X 标记处,使用 open() 函数进入鸽舍。进入后走到带有浅色 X 标记处,转身使用 close() 函数关闭门,以确保没有鸽子逃出。
走到紫色地毯上方带有暗色 X 标记处,在笔上我们将验证鸽子是否足够成熟以传递消息,或者它是否因为太小而无法送达。此阶段将使用另外四个变量常量:purple_pen、yellow_pen、white_pen 和 pink_pen,分别对应每个彩色地毯。我们将采用与备忘录相同的策略,使用之前设置的第二个类。
使用 try/except 和 else 代码块,以及 UnsuitableSelection 自定义异常来判断鸽子是否足以完成传送任务。try 块确认代表笔的变量是否对应一个适合的鸽子,判断条件是该鸽子是否小于两(2)岁。如果鸽子不适合,则触发 except 块;否则,else 块会被激活,从而允许你将该鸽子追加到 prep 列表中以便传递消息。
try: if purple_pen <= 2: raise UnsuitableSelection except UnsuitableSelection: player.speak("Pigeon unsuitable to deliver") else: prep.append(purple_pen) player.speak("Pigeon Collected")
走到每一个带有暗色 X 标记的彩色地毯前,使用对应的变量常量执行上述流程。收集完鸽子和备忘录后,走到最下方的金色 X 标记处,使用 place() 函数和你创建的 prep 列表,将鸽子发送出去以传递消息并完成本关卡。