如何捕获PyModbus的连接错误?现有代码无法触发异常如何调整?
问题原因分析
PyModbus的ModbusClient.connect()方法默认会吞掉底层串口操作的所有异常,仅通过True/False返回值标记连接结果,只会输出错误日志不会向上抛出异常,所以你的外层try-except无法捕获到连接失败的情况。
代码调整方案
1. 修改init485函数,连接失败主动抛出异常
from serial import SerialException # 可选,用于捕获更具体的串口类异常 def init485(port_in, baudrate_in): client = ModbusClient(method="rtu", port=port_in, stopbits=1 ,bytesize=8 ,parity="N", baudrate=baudrate_in, timeout=3) print("Connecting to", port_in, "...") try: connection = client.connect() except SerialException as e: # 重抛pymodbus未完全吞掉的底层串口异常 raise RuntimeError(f"串口连接失败: {str(e)}") from e sleep(5) if connection: print("Connection successful at", getcurrenttime()) else: print("Failed to connect. Please check if settings are correct.") sleep(2) # 连接失败主动抛出异常,触发外层捕获逻辑 raise RuntimeError(f"无法打开端口 {port_in},请检查端口配置、设备连接状态") return connection, client
2. 调整主循环异常捕获逻辑,解决变量未定义问题
原逻辑如果init485还未正常返回就抛出异常,mb_client变量未初始化,直接调用mb_client.close()会触发新的报错,需增加判断逻辑:
while True: mb_client = None try: c = init485("/dev/ttyUSB0", 9600) connection = c[0] mb_client = c[1] while connection: # 原有业务逻辑保留 ... except Exception as e: print(f"捕获到错误: {str(e)}") if mb_client: mb_client.close() print("Failed") sleep(60)
可选优化
如果不需要保留PyModbus默认输出的错误日志,可以在代码开头增加日志配置,屏蔽多余的框架日志输出:
import logging logging.getLogger("pymodbus").setLevel(logging.WARNING)
内容的提问来源于stack exchange,提问作者Amerul Atiq
相关产品推荐
相关产品推荐

