“在处理上述异常期间,发生了另一个异常”

时间:2019-05-08 04:41:46

标签: python-3.x exception try-catch

我正在从文件中读取分数列表,并将其解析为元组列表。如果文件为空或分母小于或等于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:被零除

在处理上述异常期间,发生了另一个异常:

1 个答案:

答案 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)