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

While True、Try循环开发问题:数据采集异常处理与时序丢失

问题解决方案

1. 连接失败时写入0值的处理

你当前的except块仅给value1赋值0,但未将这个0加入数据列表,也没处理异常后的流程延续。应该把read("x1")的调用单独包裹在try-except中,捕获连接/读取异常时,主动将0添加到list0,保证循环正常执行:

while len(list0) < 60:
    try:
        value1 = read("x1")  # 单独捕获读取操作的异常
    except Exception as e:  # 建议替换为具体异常类,比如ConnectionError、TimeoutError等,避免掩盖其他bug
        print(f"读取失败: {e}")
        value1 = 0  # 失败时赋值0
    list0.append(value1)
    # 注意:你代码里的d[value1]=list0逻辑有问题,value1是变量,每次会覆盖字典的键,建议检查这个逻辑的用途
    time.sleep(0.5)

外层的try-except不要过于宽泛,尽量只捕获预期的异常类型,防止隐藏其他代码错误。

2. 解决时序丢失问题

你当前用round(tStart/60)*60对齐分钟,但time.sleep(0.5)加上读取操作的耗时,可能导致60次循环总时间超过1分钟,或者下一轮循环的时间直接跳到下一分钟,导致跳过时间点。

正确做法是基于固定时间点调度,先锁定当前要处理的分钟,确保每个时间节点(00:01、00:02等)都能被精准触发:

import time
from datetime import datetime, timedelta

while True:
    # 锁定当前分钟的起始时间(比如00:01:00的时间点)
    now = datetime.now()
    current_minute = now.replace(second=0, microsecond=0)
    # 计算下一分钟的起始时间,用于后续等待对齐
    next_minute = current_minute + timedelta(minutes=1)
    t_write_time = current_minute.strftime('%Y/%m/%d %H:%M')

    list0 = []
    # 在当前分钟内,严格按0.5秒间隔读取60次
    for _ in range(60):
        try:
            value1 = read("x1")
        except Exception as e:
            print(f"读取失败: {e}")
            value1 = 0
        list0.append(value1)
        # 计算下一次读取的精准时间,弥补读取操作的耗时
        next_read_time = time.time() + 0.5
        time.sleep(max(0, next_read_time - time.time()))

    # 计算平均值并写入文件
    avg0 = sum(list0) / len(list0) if list0 else 0
    with open(filename, "a", newline='') as f_output:
        csv_output = csv.writer(f_output, delimiter=";")
        csv_output.writerow(['Name', t_write_time, f"{avg0:.3f}"])

    # 保留你原有的list9逻辑
    avg9 = 1/1  # 你的a和b均为1,直接写结果,建议检查此逻辑的实际用途
    list9.append(avg9)
    if len(list9) == 10:
        list9.clear()
        break

    # 等待到下一分钟的起始点,确保时序不丢失
    time.sleep(max(0, next_minute.timestamp() - time.time()))

时序修复核心点:

  • 先锁定当前处理的分钟,避免读取耗时导致时间跳变
  • 每次读取后计算下一次的精准时间点,用time.sleep(max(0, next_read_time - time.time()))弥补操作耗时,保证严格0.5秒间隔
  • 分钟结束后等待到下一分钟起始点再开始下一轮,确保每个时间节点都被处理

额外提示

  • 检查d[value1]=list0逻辑:value1是动态读取的数值,作为字典键会被不断覆盖,建议确认该字典的实际用途
  • 优先捕获具体异常类,而非宽泛的Exception,便于定位问题
  • 可添加日志记录连接失败的细节,方便后续排查

内容的提问来源于stack exchange,提问作者Student_e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:01:09