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
看你的代码和使用,可以简单
看一段代码:
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
看你的代码和使用,可以简单