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

异常后代码失效:输入无效数据后无法解析后续有效数据

问题解决:输入无效数据后无法正常解析后续有效数据

核心问题分析

你的代码存在两个关键问题:

  • 直接将用户输入的原始数据拼接进URL,未做URL编码,当有效数据包含特殊字符(如&、+、空格等)时,会导致请求URL格式错误,服务器返回非JSON内容,触发解码错误。
  • 异常捕获范围过窄,仅处理了JSONDecodeError,其他异常(如JSON结构不符预期的KeyError、网络异常)会直接终止程序,而非回到输入循环。

修改后的代码

import requests
import json

while True:
    try:
        raw = input('Please paste raw data:\n')
        # 使用params参数自动处理URL编码,避免手动拼接的格式问题
        response = requests.get('https://platform.lobaro.com/api/mbus', params={'raw': raw})
        # 显式检查请求状态码,确保请求成功
        response.raise_for_status()
        
        json_body = response.json()
        # 简化JSON格式化步骤,无需反复序列化/反序列化
        formatted_json = json.dumps(json_body, indent=2)
        print(f'\n{formatted_json}\n')

        print("INFORMATIONS:")
        producer = json_body["MFieldLongString"]
        print(f'Producer: {producer}')

        length = json_body["Length"]
        print(f'Length: {length}\n')
        print('='*78)
        
    except requests.exceptions.JSONDecodeError:
        print('Invalid data! Could not parse to JSON.\n')
    except KeyError as e:
        print(f'Invalid JSON structure: Missing required key {e}\n')
    except requests.exceptions.RequestException as e:
        print(f'Request failed: {str(e)}\n')
    # 无论是否异常,都会回到输入循环
    continue

关键修改说明

  1. URL编码处理:使用requests.get的params参数传递raw数据,requests会自动对参数值进行URL编码,避免特殊字符破坏URL结构。
  2. 请求状态检查:添加response.raise_for_status(),当服务器返回4xx/5xx错误时,会抛出RequestException,统一捕获处理。
  3. 简化JSON处理:直接使用response.json()返回的字典进行格式化和字段提取,删除了冗余的json.dumps和json.loads循环。
  4. 扩展异常捕获:新增KeyError捕获(处理返回JSON缺少指定字段的情况)和RequestException捕获(处理所有网络相关错误),确保任何异常发生后,程序都能回到输入等待状态,不会终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:40:55