Python异常处理中else与finally关键字详解
本文深入解析Python中try-except语句块内else与finally关键字的具体行为。else子句在try块未发生异常时执行,而finally子句无论是否发生异常均会执行。通过具体代码示例,阐明两者在异常捕获、程序终止及资源清理场景下的应用逻辑与执行优先级。
Python通过try-except结构实现异常处理机制。当try块中发生的异常被对应的except子句捕获时,后续代码将继续执行;若try块中的异常未被except处理,程序将抛出Traceback并终止运行。else和finally关键字正是针对这两种不同执行路径所设计的控制语句。
else子句
在try-except结构中,若try块执行期间未发生任何异常(即except子句未被触发),系统将自动执行else子句中的代码。
相反,若try块中触发了异常且该异常在except子句中被定义并处理,则程序将执行except中的逻辑,而跳过else子句。
以下代码在Python 3环境中运行通过。
try:
a = 1 / 0
except ZeroDivisionError:
print("Division is 0 ,Wrong!")
else:
print("Program is running here!")
由于代码中触发了异常(除以零),程序进入except分支进行处理。
此时不执行else子句。
输出结果:Division is 0 ,Wrong!
try:
a = 1 / 1
except ZeroDivisionError:
print("Division is 0 ,Wrong!")
else:
print("Program is running here!")
同理,若try块中未发生异常,程序将执行else子句。
输出结果:Program is running here!
因此,当try块中的异常在except子句中被明确处理时:
在try-except-else结构中,若执行了except子句,则不执行else;若执行了else子句,则说明未触发except。
另一种理解方式是:
try-except用于处理预期内的错误;若try-except未捕获到错误(即无异常发生),则属于“正常情况”,此时执行else子句。
finally子句
若try块中发生的异常未在except子句中被处理,系统将抛出Traceback(默认错误信息)并终止程序,后续代码不再执行。但若存在finally子句,程序会在抛出Traceback之前(即程序结束前)执行finally中的语句。此机制对于必须执行的收尾操作(如关闭文件句柄、释放内存空间等)非常有用。
try:
a = 1 / '1'
except ZeroDivisionError:
print("Division is 0 ,Wrong!")
else:
print("Program is running here!")
该程序将输出Traceback信息: Traceback (most recent call last): File “*********************, line 2, in a = 1 / ‘1' TypeError: unsupported operand type(s) for /: ‘int' and ‘str'
由于try块中的异常未在except子句中被处理,若修改程序如下:
try:
a = 1 / '1'
except ZeroDivisionError:
print("Division is 0 ,Wrong!")
finally:
print("Program is running here!")
输出结果:
Traceback (most recent call last): File “********************”, line 2, in a = 1 / ‘1' TypeError: unsupported operand type(s) for /: ‘int' and ‘str' Program is running here!
可见,即使Traceback异常未被消除,print语句依然被输出。这体现了finally子句作为程序收尾工作的特性。
此外,即使程序运行没有任何错误,finally子句也会被执行。
因此可以这样理解:
无论程序是否发生异常,finally子句中的语句必定执行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













