异常后代码失效:输入无效数据后无法解析后续有效数据
问题解决:输入无效数据后无法正常解析后续有效数据
核心问题分析
你的代码存在两个关键问题:
- 直接将用户输入的原始数据拼接进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
关键修改说明
- URL编码处理:使用
requests.get的params参数传递raw数据,requests会自动对参数值进行URL编码,避免特殊字符破坏URL结构。 - 请求状态检查:添加
response.raise_for_status(),当服务器返回4xx/5xx错误时,会抛出RequestException,统一捕获处理。 - 简化JSON处理:直接使用
response.json()返回的字典进行格式化和字段提取,删除了冗余的json.dumps和json.loads循环。 - 扩展异常捕获:新增
KeyError捕获(处理返回JSON缺少指定字段的情况)和RequestException捕获(处理所有网络相关错误),确保任何异常发生后,程序都能回到输入等待状态,不会终止。
内容的提问来源于stack exchange,提问作者michalb93
相关产品推荐
相关产品推荐

