sys.argv错误处理问题:指定不存在CSV文件时提示信息错误
CSV文件存在性检测的错误处理异常问题
问题描述
处理sys.argv错误时遇到异常:传入存在的CSV文件(python3 csvfind.py csvSample.csv)时程序正常,但传入不存在的文件(python3 csvfind.py csvSample2.csv)时,预期输出Error! - File Not Found!,实际却输出No CSV File has been specified(该提示仅应在未指定CSV文件时出现)。
原代码
try: # check if an CSV file has been specified if len(sys.argv) < 2: raise FileNotFoundError('No CSV File has been specified!') else: csv_file = sys.argv[1] file = open(csv_file, 'r') ld = load_data(csv_file) print("Source File: " + str(sys.argv[1])) except ValueError: print('Error! - File Not Found!') except TypeError: print('Error! - File Not Found!') except FileNotFoundError: print('No CSV File has been specified!')
输入输出情况
- 输入命令:
python3 csvfind.py csvSample2.csv
- 预期输出:
Error! - File Not Found!
- 实际输出:
No CSV File has been specified
错误原因
你把两种完全不同的错误场景绑定到了同一个异常类型上:
- 当未传入参数时,你手动抛出了
FileNotFoundError - 当传入不存在的文件名时,
open()函数也会抛出FileNotFoundError
这两个异常会被同一个except FileNotFoundError块捕获,导致文件不存在的错误被错误地提示为“未指定文件”。
另外,你捕获的ValueError和TypeError完全多余,打开不存在的文件不会触发这两种异常。
修复方案
方案1:拆分错误处理逻辑
先单独处理参数不足的情况,再对文件操作单独捕获异常:
import sys def load_data(file_path): # 你的数据加载逻辑 pass # 先检查参数数量 if len(sys.argv) < 2: print('No CSV File has been specified!') sys.exit(1) csv_file = sys.argv[1] try: # 使用with语句自动管理文件资源 with open(csv_file, 'r') as file: ld = load_data(csv_file) print(f"Source File: {sys.argv[1]}") except FileNotFoundError: print('Error! - File Not Found!')
方案2:使用不同异常区分场景
如果坚持用try/raise的方式,可改用其他异常类型区分参数缺失和文件不存在:
import sys def load_data(file_path): # 你的数据加载逻辑 pass try: if len(sys.argv) < 2: # 用RuntimeError区分参数缺失的场景 raise RuntimeError('No CSV File has been specified!') csv_file = sys.argv[1] with open(csv_file, 'r') as file: ld = load_data(csv_file) print(f"Source File: {sys.argv[1]}") except RuntimeError as e: print(e) except FileNotFoundError: print('Error! - File Not Found!')
说明
- 用
with语句打开文件可以自动关闭文件,避免资源泄漏 - 拆分逻辑后,参数不足和文件不存在的错误场景被明确区分,各自对应正确的提示信息
内容的提问来源于stack exchange,提问作者J Lee
相关产品推荐
相关产品推荐

