答案:try块首先执行,无异常时执行else块,有异常时由except块处理,finally块始终最后执行。无论是否发生异常、是否被捕获,finally块都会在try、except或else之后执行,确保清理代码运行。

在Python的异常处理机制里,
try
except
else
finally
try
try
try
else
finally
try
try
except
except
except
finally
else
except
return
try-except-else-finally
理解
try-except-else-finally
try
except
else
finally
我们来看几种典型情况:
1. try
在这种最理想的情况下,程序的执行路径是:
try
else
finally
print("--- 场景1:无异常 ---")
try:
print("在 try 块中执行代码...")
result = 10 / 2
print(f"try 块执行完毕,结果: {result}")
except ZeroDivisionError:
print("在 except 块中处理 ZeroDivisionError...")
except Exception as e:
print(f"在 except 块中处理其他异常: {e}")
else:
print("在 else 块中执行代码,因为 try 块没有异常。")
finally:
print("在 finally 块中执行代码,无论如何都会执行。")
print("结构外部代码继续执行。\n")输出会清晰地展示这个顺序:
在 try 块中执行代码...
try 块执行完毕,结果: 5.0
在 else 块中执行代码,因为 try 块没有异常。
在 finally 块中执行代码,无论如何都会执行。
结构外部代码继续执行。
2. try
except
当
try
try
except
finally
else
print("--- 场景2:发生异常并被捕获 ---")
try:
print("在 try 块中执行代码...")
result = 10 / 0 # 这里会引发 ZeroDivisionError
print(f"try 块执行完毕,结果: {result}") # 这行不会被执行
except ZeroDivisionError:
print("在 except 块中处理 ZeroDivisionError...")
except Exception as e:
print(f"在 except 块中处理其他异常: {e}")
else:
print("在 else 块中执行代码,因为 try 块没有异常。") # 这行不会被执行
finally:
print("在 finally 块中执行代码,无论如何都会执行。")
print("结构外部代码继续执行。\n")输出:
在 try 块中执行代码...
在 except 块中处理 ZeroDivisionError...
在 finally 块中执行代码,无论如何都会执行。
结构外部代码继续执行。
3. try
except
如果异常发生了,但没有
except
try
finally
finally
print("--- 场景3:发生异常但未被捕获 ---")
try:
print("在 try 块中执行代码...")
my_list = [1, 2]
print(my_list[3]) # 这里会引发 IndexError
except ZeroDivisionError: # 只能捕获 ZeroDivisionError
print("在 except 块中处理 ZeroDivisionError...")
else:
print("在 else 块中执行代码...")
finally:
print("在 finally 块中执行代码,无论如何都会执行。")
print("结构外部代码继续执行。") # 这行不会被执行,因为异常未被处理输出:
在 try 块中执行代码...
在 finally 块中执行代码,无论如何都会执行。
Traceback (most recent call last):
File "...", line X, in <module>
print(my_list[3]) # 这里会引发 IndexError
IndexError: list index out of range
可以看到,
finally
IndexError
else
else
try
try
except
except
else
try
else
举个例子,如果你在
try
else
else
所以,记住一点:
else
try
try
try
else
finally
return
finally
这种“无条件执行”的特性,甚至凌驾于
return
try
except
return
finally
return
我们来看一个函数中的例子:
def example_function():
print("函数开始执行...")
try:
print("在 try 块中...")
# 假设这里有一些操作
return "从 try 块返回" # 尝试返回
except Exception as e:
print(f"在 except 块中处理异常: {e}")
return "从 except 块返回" # 尝试返回
finally:
print("在 finally 块中执行清理工作...")
# 即使上面有 return,这里也会执行
print(example_function())
print("\n--- 另一个带有异常的例子 ---")
def another_example_function():
print("函数开始执行...")
try:
print("在 try 块中...")
result = 1 / 0 # 制造一个异常
return "从 try 块返回"
except ZeroDivisionError:
print("在 except 块中处理 ZeroDivisionError...")
return "从 except 块返回 (ZeroDivisionError)"
finally:
print("在 finally 块中执行清理工作,即使有异常和返回...")
print(another_example_function())你会发现,即使
return
try
except
finally
finally
try-except
当
try-except
except
想象一下,你有一个外层的
try-except
try-except
内层 try
except
try-except
print("--- 场景:内层捕获并处理 ---")
try:
print("外层 try 开始")
try:
print("内层 try 开始")
value = int("abc") # 制造 ValueError
print("内层 try 结束")
except ValueError as e:
print(f"内层 except 捕获到: {e}")
finally:
print("内层 finally 执行")
print("外层 try 结束")
except Exception as e:
print(f"外层 except 捕获到: {e}")
finally:
print("外层 finally 执行")
print("程序继续")输出会显示内层
except
try
finally
内层 try
except
except
try
finally
try-except
except
except
print("\n--- 场景:内层未捕获,外层捕获 ---")
try:
print("外层 try 开始")
try:
print("内层 try 开始")
result = 10 / 0 # 制造 ZeroDivisionError
print("内层 try 结束")
except ValueError as e: # 内层只捕获 ValueError
print(f"内层 except 捕获到: {e}")
finally:
print("内层 finally 执行") # 内层 finally 仍会执行
print("外层 try 结束") # 这行不会被执行
except ZeroDivisionError as e: # 外层捕获 ZeroDivisionError
print(f"外层 except 捕获到: {e}")
finally:
print("外层 finally 执行")
print("程序继续")这里,内层的
ZeroDivisionError
except
finally
except
理解这种冒泡机制非常重要,它决定了你的错误处理逻辑应该放在哪一层。通常,我们会把更具体的、能立即恢复的异常处理放在内层,而把那些更通用的、或者需要更高层级决策的异常处理放在外层。这种分层处理,在我看来,能让代码的异常处理逻辑更清晰,也更具弹性。
以上就是异常处理:try、except、else、finally 的执行顺序的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号