在Python的循环逻辑开发中,经常会遇到循环体内调用函数的情况,如果函数执行过程中抛出异常,默认情况下会导致整个程序终止。但实际需求往往是在函数抛出异常时,只跳过当前循环剩余的代码,直接进入下一次循环,而不是让整个程序崩溃。要实现这个效果,核心是结合异常处理机制和循环控制关键字来完成。

基础实现方式:try except结合continue
最直接的方式是在循环体内把函数调用放在try代码块中,捕获对应的异常后,在except代码块中使用continue关键字,就可以中断当前循环迭代,直接进入下一次循环。下面的示例模拟了循环调用一个可能抛出异常的函数,抛出异常时跳过当前迭代:
def risky_func(num):
# 模拟可能抛出异常的函数,当num为0时触发异常
if num == 0:
raise ValueError("输入值不能为0")
return 10 / num
nums = [2, 0, 5, 0, 3]
for n in nums:
try:
# 调用可能抛出异常的函数
result = risky_func(n)
print(f"计算结果:{result}")
except ValueError as e:
# 捕获异常后,打印异常信息,然后使用continue进入下一次循环
print(f"处理{n}时触发异常:{e}")
continue
# 如果没触发异常,才会执行这里的后续逻辑
print(f"当前数字{n}处理完成")运行上面的代码,当循环到n为0时,调用risky_func会抛出ValueError,进入except代码块,打印异常信息后执行continue,直接跳过后续的“处理完成”打印,进入下一次循环,不会终止整个循环。
捕获多种异常的场景
如果函数可能抛出多种不同类型的异常,也可以在except中捕获多个异常类型,同样在捕获后使用continue即可。示例代码如下:
def multi_risky_func(num):
if num < 0:
raise TypeError("输入不能为负数")
if num == 0:
raise ValueError("输入不能为0")
return 10 / num
test_nums = [-1, 0, 2, 5]
for n in test_nums:
try:
res = multi_risky_func(n)
print(f"结果:{res}")
except (TypeError, ValueError) as e:
print(f"处理{n}出错:{e}")
continue
print(f"{n}处理完毕")注意事项
- 尽量捕获具体的异常类型,不要直接使用except捕获所有异常,避免隐藏其他未知的错误。
- 如果循环中还有其他需要执行的逻辑,要注意continue的位置,确保异常发生后跳过的逻辑是符合预期的。
- 如果需要在异常发生时记录日志或者做其他处理,可以在except代码块中先完成对应操作,再执行continue。
总结
要在Python函数调用触发异常后立即中断当前循环进入下一个循环,核心就是在循环体内用try包裹函数调用,捕获异常后在except块中使用continue关键字。这种方式逻辑清晰,兼容性好,适用于绝大多数循环内处理异常并继续下一次迭代的场景,开发者可以根据实际需求调整捕获的异常类型和异常处理逻辑。