捕获异常后如何继续循环

时间:2015-02-13 16:44:45

标签: python

以下代码在处理非int值时会产生异常,但它不会继续循环,而是从循环引发错误中产生。我的目的是为异常情况提供值0。

示例输入:

Common Ruby Errors 45min
Rails for Python Developers lightning

代码:

class TimeNotProvidedError(Exception):
    pass

def extract_input():
    lines = []
    __tracks = {}

    try:
        lines = [line.strip() for line in open('test.txt')]
    except FileNotFoundError as e:
        print("File Not Found", e)

    for line in lines:
        title, minutes = line.rsplit(maxsplit=1)
        minutes = int(minutes[:-3])
        try:
            __tracks[title] = minutes
        except TimeNotProvidedError:
            __tracks[title] = 0
    return __tracks

print(extract_input())

回溯:

ValueError: invalid literal for int() with base 10: 'lightn'

1 个答案:

答案 0 :(得分:3)

使用此行转换为int时,您收到了错误:minutes = int(minutes[:-3])。该行不在try块中,因此异常未被捕获。将该行移到try块内,您将获得所需的行为。

此外,您捕获的例外情况是TimeNotProvidedError,这不是int在转换失败时抛出的内容。相反,它会抛出ValueError,因此您需要捕获异常类型。


仅仅分配给__tracks[title]的行为不太可能导致异常,如果 ,则重新尝试使用其他分配可能无论如何都无法正常工作。您在循环中可能需要的是:

title, minutes = line.rsplit(maxsplit=1)
try:
    minutes = int(minutes[:-3])
except ValueError:
    minutes = 0
__tracks[title] = minutes