Python面向对象编程进阶:异常层级与自定义异常类详解
Python面向对象编程进阶:异常层级与自定义异常类详解
摘要
本文详细讲解了在Python进行面向对象编程时如何理解异常层级结构,以及如何利用类继承机制构建适用于项目需求的自定义异常类。通过传感器数据采集的实例,展示了如何在实际工程中应用异常处理机制。
获取文档与代码
本文档重点讲解 Python 面向对象编程的实践方法,适用于已经具备 Python 编程基础并希望掌握嵌入式应用开发的读者。文档以上位机和下位机之间的串口通信、数据解析和动态图形显示等典型应用为案例,并结合 Sourcetrail 工具进行代码结构可视化,便于深入理解。
正文
Python 异常层级体系
在 Python 的异常处理机制中,绝大多数异常类型都继承自 Exception 类,但并非所有异常都遵循这一结构。实际上,Exception 本身继承自 BaseException,而所有异常类最终都需继承自 BaseException。
有两个例外值得关注,分别是 SystemExit 和 KeyboardInterrupt,它们直接继承自 BaseException 而非 Exception。这些异常用于控制程序的终止行为,常见于系统级操作或用户手动中断。
-
SystemExit异常通常在程序正常结束时抛出,比如执行sys.exit()。它允许在程序关闭前完成必要的清理操作,清理逻辑通常放在finally块中,确保资源释放的完整性。 -
KeyboardInterrupt则在用户通过命令行中断程序运行时触发(如按下 Ctrl+C)。这种异常表明用户主动要求程序终止,处理方式通常与SystemExit类似,同样建议在finally块中执行清理任务。
以下是 Python 内置异常的类结构图示:
当使用 except: 语句而不指定异常类型时,Python 会捕获 BaseException 及其所有子类,这包括 SystemExit 和 KeyboardInterrupt。因此,如果意图仅捕获除这两类之外的异常,推荐使用 except Exception:。而若确实需要捕获所有异常,应使用 except BaseException: 以明确意图。
自定义异常类的实现方法
在许多实际应用场景中,Python 内置的异常类可能无法满足特定需求。因此,开发者可以根据项目需要定义自定义异常类。自定义异常通常用于标识特定的运行时错误,增强代码的可读性与可维护性。
所有自定义异常类都应继承自 Exception 或其子类。通常,这些异常类仅用于传递错误信息,并不承担复杂逻辑。命名上,建议以 Error 结尾,以符合标准命名规范。
下面是一个示例:定义一个用于检测非法传感器 ID 的异常类。
# 定义一个用于标识非法 ID 的异常类class InvalidIDError(Exception): passclass SensorClass(SerialClass): RESPOND_MODE, LOOP_MODE = (0, 1) START_CMD, STOP_CMD, SENDID_CMD, SENDVALUE_CMD = (0, 1, 2, 3) def __init__(self, port: str = "COM11", id: int = 0, state: int = RESPOND_MODE): try: if type(port) is not str: raise TypeError("InvalidPortError:", port) if id <= 0 or id >= 99: raise InvalidIDError("InvalidIDError:", id) super().__init__(port) self.sensorvalue = 0 self.sensorid = id self.sensorstate = state print("Sensor Init") logging.info("Sensor Init") except TypeError: print("Input error com, Please try new com number") except InvalidIDError as e: print("Input error ID, Please try id : 0~99") print(e.args)运行结果如下:
在 InvalidIDError 的定义中,允许传递多个参数,这些参数通常以字符串形式描述错误原因,也可包含其他有助于异常处理的信息。Python 的 Exception 类会将这些参数存储在 args 属性中,以便在异常捕获时获取并使用。
在一些更复杂的应用场景中,开发者也可以扩展 __init__ 方法,以实现更丰富的异常信息管理。
例如,在传感器数据异常处理中,可以定义一个用于识别数据异常的 InvalidSensorValueError 类,并添加计算误差的方法。代码如下:
# 自定义传感器值异常类class InvalidSensorValueError(Exception): def __init__(self, recvvalue, setvalue): super().__init__("Receive Sensor Value is too high") self.recvvalue = recvvalue self.setvalue = setvalue def cal_offset(self): offset = self.setvalue - self.recvvalue return offsetclass MasterClass(SerialClass, PlotClass): def RecvSensorValue(self): try: setvalue = 99 data = super().ReadSerial() if data >= setvalue: raise InvalidSensorValueError(data, setvalue) print("MASTER RECIEVE DATA : " + str(data)) logging.info("MASTER RECIEVE DATA : " + str(data)) self.valuequeue.put(data) except InvalidSensorValueError as e: print("invalid sensor value", e.args) print("value offset is : ", e.cal_offset()) return dataif __name__ == "__main__": m = MasterClass() m.StartMaster() m.RecvSensorValue()执行结果如下:
通过自定义异常,开发者不仅能够更准确地表达错误性质,还能将异常处理逻辑封装在类结构中,提升代码的模块化与重用性。这在构建传感器数据采集系统、工业控制框架或任何需要可靠错误处理机制的项目中都具有重要意义。
查看全文
芯兔兔



评论0条评论