高级 Python 开发课程
第 章
>
第 级

异常处理
自定义异常类

目标

通过自定义异常类来验证收集的雨水,并确保其被正确处理和传输。

在屋顶复合体的最远端有一个收集雨水的水箱,这些雨水经过过滤后在建筑内传输,用于各种用途。上墙上的一些阀门控制着水流的压力,而最后一个储藏室则存放着各种热水器。操作机械设备可能很棘手,但通过列出错误代码和设置有效的对策,可以有效地简化其运行。这是通过为定制异常创建的自定义异常类来实现的。

代码编辑器中已经设置了两个自定义异常类,你能否使用它们将对排除你所遇到的任何机械问题至关重要。第一个是用于排除水压问题的异常。它用于阀门,以确保水正确地流入综合体,或者需要调整压力。根据压力是否低于 100 或高于 300,异常将采取不同的操作,压力是用户必须提供的参数。一旦触发,就会显示一个包含错误代码和消息的自定义弹出窗口。

class PressureError(Exception): def __init__(self, pressure, message="Water pressure is offset, pressure is: ", error_code=404): self.pressure = pressure self.message = message self.error_code = error_code super().__init__(self.message) async def eval(self): await player.display("[Error: %s {%s %s}]" % (self.error_code , self.message, self.pressure)) if self.pressure < 100: return ("Valve has been closed") if self.pressure > 360: return ("Valve has been opened")

第二个自定义异常类用于调节热水器的温度,如果温度过低或过高,你必须输入一个新的温度作为参数,以便在错误发生时进行更正。

class TemperatureError(Exception): def __init__(self, temp, message="Temperature is not appropiate, enter new temperature: ", error_code=808): self.temp = temp self.message = message self.error_code = error_code super().__init__(self.message) async def eval(self): await player.display("[Error: %s {%s %s}]" % (self.error_code , self.message, self.temp)) return ("Temperature Corrected")

首先,走向绿地毯上标有 X 的光标,并面向带有阀门的水箱,在那里有四个(4)阀门调节从水箱中抽水的水压。有四个(4)变量常量:green_pressurered_pressureblue_pressureorange_pressure,它们分别保存对应彩色地毯下各水箱的压力值。

在所有带有 X 标志的地方,使用 try/exceptelse 代码块序列来验证每个水箱的压力是否合适。如果压力低于 100 或高于 300,则抛出自定义的 PressureError 异常,并把压力作为参数传入。如果激活,它将显示错误代码并发出更正指令,否则将触发 else 子句,确认水箱内的压力是合适的。例如:

try: if green_pressure < 100 or green_pressure > 360: raise PressureError(green_pressure) except PressureError as x: error = await x.eval() player.speak(error) else: player.speak( "Pressure is appropriate" )

对所有带有 X 标志的地方都这么做,使用与相应彩色地毯对应的变量常量,依此来验证或调整压力阀。

完成后,走到金色 X 标志处,并使用 open() 函数访问带有热水器的储藏室,一旦进入,在储藏室内走向金色 X 标志处,并使用 read() 函数阅读柜台上的便条。该便条将为你提供每个热水器的理想温度信息。

获得每个温度的信息后,走到紫色地毯上的暗 X 标志处,在这里我们将使用 try/exceptelse 代码序列来验证热水器的温度是否正确。有另外四个(4)变量常量与彩色地毯关联:purple_temperatureyellow_temperaturepink_temperaturewhite_temperature

在这个序列中,我们将验证温度是否低于 100,如果是,就抛出 TemperatureError 异常。作为一个自定义异常,它需要一个参数,在这种情况下,你必须输入便条中读取到的温度,以便正确执行异常的对策来纠正问题。例如:

try: if purple_temperature < 100: raise TemperatureError(120) except TemperatureError as x: error = await x.eval() player.speak(error) else: player.speak( "Temperature is ok" )

对所有热水器都这么做,在每个标有 X 的地方,当面向热水器时,使用与相应彩色地毯对应的变量常量执行该序列,以完成这一关卡。

代码书