Python面向对象编程进阶:异常层级与自定义异常类详解

2026-05-14 15:58:23
关注

Python面向对象编程进阶:异常层级与自定义异常类详解

摘要

本文详细讲解了在Python进行面向对象编程时如何理解异常层级结构,以及如何利用类继承机制构建适用于项目需求的自定义异常类。通过传感器数据采集的实例,展示了如何在实际工程中应用异常处理机制。

获取文档与代码

本文档重点讲解 Python 面向对象编程的实践方法,适用于已经具备 Python 编程基础并希望掌握嵌入式应用开发的读者。文档以上位机和下位机之间的串口通信、数据解析和动态图形显示等典型应用为案例,并结合 Sourcetrail 工具进行代码结构可视化,便于深入理解。

正文

Python 异常层级体系

在 Python 的异常处理机制中,绝大多数异常类型都继承自 Exception 类,但并非所有异常都遵循这一结构。实际上,Exception 本身继承自 BaseException,而所有异常类最终都需继承自 BaseException

有两个例外值得关注,分别是 SystemExitKeyboardInterrupt,它们直接继承自 BaseException 而非 Exception。这些异常用于控制程序的终止行为,常见于系统级操作或用户手动中断。

  • SystemExit 异常通常在程序正常结束时抛出,比如执行 sys.exit()。它允许在程序关闭前完成必要的清理操作,清理逻辑通常放在 finally 块中,确保资源释放的完整性。

  • KeyboardInterrupt 则在用户通过命令行中断程序运行时触发(如按下 Ctrl+C)。这种异常表明用户主动要求程序终止,处理方式通常与 SystemExit 类似,同样建议在 finally 块中执行清理任务。

以下是 Python 内置异常的类结构图示:

当使用 except: 语句而不指定异常类型时,Python 会捕获 BaseException 及其所有子类,这包括 SystemExitKeyboardInterrupt。因此,如果意图仅捕获除这两类之外的异常,推荐使用 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()

执行结果如下:

通过自定义异常,开发者不仅能够更准确地表达错误性质,还能将异常处理逻辑封装在类结构中,提升代码的模块化与重用性。这在构建传感器数据采集系统、工业控制框架或任何需要可靠错误处理机制的项目中都具有重要意义。

您觉得本篇内容如何
评分

相关产品

英锐祺 IRW-S1210 输变电在线监测

2.4G微功率协议数据采集器(usb接口)是一款针对国网、电力行标《输变电设备物联网微功率无线网通信协议》数据的空口抓包、解析工具,可用于无线微功率传感器数据采集,用户可根据采集的数据判断传感器工作状态该工具采集的数据可通过串口工具在电脑上打印显示,具有外观精致小巧,便于固定,功耗低等优点,适用于现场工程运维的数据监测,也可适用于传感器研发测试。

HDARE 华科电子 HK-2000C HK-2000C集成化数字脉搏传感器

HK-2000C集成化数字脉搏传感器 HK-2000C集成化数字脉搏传感器是在HK-2000B的基础上增加了程控放大电路、基线调整电路、A/D转换电路、串行通信电路,方便用户集成及二次开发使用。压电式原理采集信号,数字信号输出,直接通过USB或串口输出脉搏波波形数据。在电脑上运行我们附送的演示程序可以直观的在电脑屏幕上显示脉搏波形并可以对波形的幅值、频率、基线等进行调整。

Sunyuan 顺源科技 SY AD 04/SY AD08系列 数据采集器

SY系列AD产品(亚当模块)可实现传感器和主机之间的信号安全隔离和高精度数据采集、隔离转换、监控与传输。产品广泛应用于RS232/485总线工业自动化控制系统,4-20mA / 0-10V模拟量检测、监视和控制,小信号的测量以及工业现场传感器信号隔离传输等远程监控场合。通过软件的配置,可接入多种传感器类型,包括电流输出型、电压输出型等。产品内部包括电源隔离,信号隔离、线性化,A/D转换和RS-485串行通信等模块。每个串口最多可接256只SY AD系列模块,通讯方式采用ASCII码字符通讯协议或MODBUS RTU通讯协议,其指令集兼容于ADAM模块,波特率可由用户设置,能与其他厂家的控制模块挂在同一RS-485

评论

您需要登录才可以回复|注册

提交评论

提取码
复制提取码
点击跳转至百度网盘