【问题标题】:How would i go about handling multiple file exceptions?我将如何处理多个文件异常?
【发布时间】:2019-08-24 19:52:47
【问题描述】:

基本上我需要创建一个函数,允许我从文件中加载计划旅程的基本细节。我们是这样的:

参数:包含文件路径的字符串

返回:包含从文件中读取的旅程的开始位置、结束位置和到达时间的三元组字符串,如果不成功,则返回 (None, None, None)。

有多个测试都使用幻数作为输入。测试如下:

这是坏数据测试的代码,应该给你一个测试的例子:

    PATH = os.path.expanduser('~/test_prev_plan_spec.txt')

    def test_missing_file_is_handled(self):
        if os.path.exists(self.PATH):
            os.unlink(self.PATH)
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_spec_loads_ok(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        arrive_at = '2019/04/20 13:30'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(from_, plan[0])
        self.assertEqual(to, plan[1])
        self.assertEqual(arrive_at, plan[2])

    def test_short_spec_is_ignored(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n'.format(from_, to))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

        with open(self.PATH, 'wt') as f:
            f.write('{}\n'.format(from_))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_empty_line_is_handled(self):
        from_ = 'Bournemouth'
        to = ''
        arrive_at = '2019/04/20 13:30'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

    def test_bad_data_line_is_handled(self):
        from_ = 'Bournemouth'
        to = 'Southampton'
        arrive_at = '2019/04/20 13:60'
        with open(self.PATH, 'wt') as f:
            f.write('{}\n{}\n{}\n'.format(from_, to, arrive_at))
        plan = utils.load_prev_plan_spec(self.PATH)
        self.assertEqual(3, len(plan))
        self.assertEqual(plan, (None, None, None))

这是我到目前为止所拥有的,我正在寻求帮助,任何解释都会很棒!

我的密码ATM:

def load_prev_plan_spec(PATH):
    '''
    Function: utils.load_prev_plan_specLoads the basic details of a planned journey from a file.
    Parameters: A string containing a file path
    Returns: A 3-tuple of strings containing start location, end location and arrival time of a journey
    read from the file, or (None, None, None) if unsuccessful.
    '''


    try:
        if os.path.exists(PATH):
            infomation = []
            f = open(PATH, 'r', encoding='cp1252')
            for line in f:
                infomation.append([line.strip()])
                if not line.strip():
                    infomation = (None, None, None)
            tuple(infomation)
            f.close()
            return infomation
        else:
            pass
    except IOError as err2:
        print(err2)
        raise IOError
    else:
        return infomation

【问题讨论】:

  • 不清楚您实际要问的是什么。您要做什么也不完全清楚。通常,您应该提供一个简明的工作示例来说明您的问题,并告诉我们您的尝试。如果您只是询问如何处理异常,请阅读here。然后,阅读文档以了解您使用的方法可能引发哪些异常,可能添加一些自定义异常并使用try-except 进行处理。

标签: python python-3.x exception


【解决方案1】:

第一个失败的测试是因为如果第一行或第二行为空,则将具有三个 None 值的元组绑定到 infomation,然后下一次迭代尝试将 append() 某些内容绑定到该元组 - 但元组不要'没有append() 方法。如果遇到空行,则需要停止处理这些行并返回错误值。

第二次失败的测试是因为您尝试在函数的最后一行返回infomation,但如果文件不存在,则没有为该名称分配值的执行路径。

第三次失败没有识别出13:60 不是一个有效的时间值。

第四次失败返回两个值而不是三个,因为你没有检查文件中是否真的有三行,而不是更少。

第六次也是最后一次失败是因为您将每个项目都包装在一个列表中。为什么?

通过所有测试用例的函数可能如下所示:

from datetime import datetime as DateTime


def load_prev_plan_spec(path):
    try:
        with open(path, 'r', encoding='cp1252') as file:
            lines = [line.strip() for line in file]
            if len(lines) == 3 and all(lines):
                try:
                    # 
                    # Just for the `ValueError` to test if string is a valid 
                    # timestamp.
                    # 
                    DateTime.strptime(lines[-1], '%Y/%m/%d %H:%M')
                except ValueError:
                    pass  # Intentionally ignored.
                else:
                    return tuple(lines)
    except (OSError, UnicodeDecodeError):
        pass  # Intentionally ignored.

    return (None, None, None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多