我正在从文件中读取分数列表,并将其解析为元组列表。如果文件为空或分母小于或等于0,我希望发生错误。
我尝试将if(EOFERRor),elif(zerodivisionerror),elif(assertionerror)或else ..放在InvalidFile(Exception)类中。在我的异常出现之前,要读取文件的末尾,因此这就是为什么我专门将其包含在文件中。
我的猜测是EOF与零除同时发生,但我将列表与文件分开以防止发生这种情况
class InvalidFile(Exception):
if(EOFError):
pass
else:
print('Invalid file format')
sys.exit(1)
def createFractionList(filePath):
try:
f = open(inFile)
f.close()
except FileNotFoundError:
print('FileNotFoundError')
sys.exit(1)
fractionList = []
for line in open(filePath):
line = line.rstrip()
try:
numerator, denominator = tuple(int(x) for x in line.split())
except:
raise InvalidFile
fractionList.append((numerator, denominator))
for lists in fractionList:
try:
lists[0]/lists[1]
except:
raise InvalidFile
return fractionList
dateList = createFractionList(inFile)
print(dateList)
输入:
1 0
3 4
5 6
7 8
9 10
0 8
2 4
9 12
20 24
35 40
54 60
预期输出: 文件格式无效
实际: C:\ Users \ Xavier \ PycharmProjects \ hw4 \ venv \ Scripts \ python.exe C:/Users/Xavier/PycharmProjects/hw4/hw4.py 追溯(最近一次通话): createFractionList中的文件“ C:/Users/Xavier/PycharmProjects/hw4/hw4.py”,第33行 列表[1] / 0 ZeroDivisionError:被零除在处理上述异常期间,发生了另一个异常:
答案 0 :(得分:0)
InvalidFile
异常的主体不执行任何操作,因为它仅在声明时运行。无论如何,if EOFError
始终为真,因此什么也不会发生。您应该做的是使用自定义文本覆盖__init__
方法。就我个人而言,我认为您不需要自定义例外,而可以只使用内置例外。
您的第一个错误是FileNotFoundError
,最好通过os.path.exists()
进行检查。
打开文件时,应使用上下文管理器,这样就不必担心关闭文件了。
您不需要剥离该行,因为`int('1 \ n')已经剥离了空格。但是也许输入文件中有空行,所以我们可以保留它。
您不需要先遍历文件再遍历列表,因为如果在任何时候分母小于或等于0,都将引发错误。没有必要将错误延迟到以后。似乎也没有必要做除法,因为如果失败了,您可以提前解决。
总而言之,您可以这样重写代码:
import os.path
def create_fraction_list(file_path):
if not os.path.exists(file_path):
raise FileNotFoundError(file_path)
fraction_list = []
with open(file_path) as f:
for line in f:
line = line.strip()
if not line:
# have a blank line
continue
numerator, denominator = (int(x) for x in line.split())
if denominator <= 0:
raise ValueError(f'Denominator less that or equal to 0: {numerator}/{denominator}')
fraction_list.append((numerator, denominator))
if not fraction_list:
# it's empty
raise ValueError(f'Input file has no valid lines: {file_path}')
return fraction_list
if __name__ == '__main__':
try:
fraction_list = create_fraction_list(inFile)
print(fraction_list)
except (FileNotFoundError, ValueError):
print('Invalid file format.')
sys.exit(1)