Python finally 阻止不捕获错误

Python finally block not catching errors

看一段代码:

move = [None, 20, 5, True, "a"]   
valnum = 0
    for val in move:
        try:
            if val >= 15:
                val -= 3
                move[valnum] = val
        finally:
            valnum += 1
print(move)

当运行时,报错:

TypeError: '>=' not supported between instances of 'NoneType' and 'int'

finally 语句的全部意义不就是为了避免这样的错误吗?

编辑:感谢您的帮助。我认为我的问题不够清楚。根据您的建议,我将其编码为:

move = [None, 20, 5, True, "a", 19]   
valnum = 0
for val in move:
    try:
        if val >= 15:
            val -= 3
            move[valnum] = val
    except TypeError:
        valnum += 1
print(move)

现在输出变为:

[None, 17, 16, True, 'a', 19]

很容易看出哪里出了问题。当出现错误时,异常块只有 运行s,但无论是否有错误,我都需要块到 运行。有没有解决这个问题的方法,除了:

move = [None, 20, 5, True, "a", 19]   
valnum = 0
for val in move:
    try:
        if val >= 15:
            val -= 3
            move[valnum] = val
    except TypeError:
        valnum += 1
        continue
    valnum += 1
print(move)

不,不是。

它的作用是确保始终执行某些操作,无论是否存在异常。它不会捕获异常,因为你需要一个 except 块。

例如:

for val in move:
    try:
        if val >= 15:
            val -= 3
            move[valnum] = val
    except TypeError:
        valnum += 1

finally 块对于诸如资源清理、关闭文件之类的事情很有用。


根据 Big Bird 的评论,下面是 运行 代码并忽略错误的方法:

for val in move:
    try:
        if val >= 15:
            val -= 3
            move[valnum] = val
    except TypeError:
        pass  # catch the error and ignore it
    valnum += 1

再次编辑,我现在才意识到你想做什么,因为我太专注于如何你是试图做到这一点。我建议根本不关心 valnum,而是这样做:

move = [None, 20, 5, True, "a", 19]   
for index, val in enumerate(move):
    try:
        if val >= 15:
            val -= 3
            move[index] = val
    except TypeError:
        pass
print(move)

您想使用 'except' 来处理它。您的代码应如下所示:

move = [None, 20, 5, True, "a"]   
valnum = 0
for val in move:
    try:
        if val >= 15:
            val -= 3
            move[valnum] = val
    except TypeError:
        valnum += 1
print(move)

当你使用finally时,意味着finally里面的代码会运行在try条件之后作为一个clean-up动作。 您可以查看文档以获取有关 finally 操作的更多信息:https://docs.python.org/3/tutorial/errors.html#defining-clean-up-actions

看你的代码和使用,可以简单