You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:24:02