我在sys. argv的错误处理上遇到了问题。基本上,我希望我的代码检查我是否输入了错误的.csv文件(该目录中实际上不存在的csv文件)作为参数。
我尝试过使用sys.argv和try/else进行错误处理
例如,正确的参数是python3 csvfind.py csvSample.csv,但是假设我输入了一个不存在的.csv文件,所以:python3 csvfind.py csvSample2.csv.我希望我的代码打印('错误!页面没有找到!'),但我一直得到(' 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
1条答案
按热度按时间3df52oht1#
我知道您希望缺少一个 * 参数 * 来生成错误,“未指定CSV文件!”,并且希望缺少 * 文件 * 以生成错误“Error!页面未找到!“虽然我可以指出问题所在,但我不知道更大的图景,所以我不知道该推荐什么。不过,我还是会在下面试试。
问题是:您的自定义
raise FileNotFoundError("No CSV File...")
和open(csv_file, 'r')
引发相同的异常:文件未找到错误。当你给予
open(...)
一个不存在的文件时,open(...)
会引发这个异常。因此,对于您所展示的简单代码,您可能永远不会引发一个实际的ValueError来捕获并打印“Error!页面未找到!“.为了帮助说明这一点,我将您的程序简化为以下内容:
FileNotFourndError
;或者...我删除了所有的异常处理,这样我们就可以清楚地看到程序生成了什么异常以及它们来自哪里:
我的测试目录中只有一个CSV,input1.csv。当我以以下三种不同的方式运行命令时,我得到:
我们现在可以清楚地看到,open(...)中的显式raise和隐式raise都是FileNotFoundErrors,这就是为什么你试图建立的两个不同条件会得到相同的错误。
怎么办?
同样,我不知道您的程序的总体情况是什么,所以我假设您正在编写一个命令行实用程序来处理CSV。这些年来,我写了大约一百篇这样的文章,我已经开发了一种“防范”少数的做法/风格,明显的,和可能突然出现的已知的坏先决条件,就像你一样:
1.未指定CSV文件
1.指定的CSV文件不存在
我尽量避免在一开始就定义太多的异常。我只是去与毯子
except Exception as e
,并打印它。随着时间的推移,我可能会开始看到我遇到的常见问题,只有这样我才开始编写特殊的错误处理。