精通 Python 异常处理:try、except、else 与 finally 详解
精通 Python 异常处理:try、except、else 与 finally 详解
本指南通过实用代码片段和最佳实践技巧,带你了解 Python 的异常处理结构。
视频:Python 异常处理(try..except..finally)
Python 中的异常
运行时错误发生时,Python 会引发内置异常。解释器停止当前代码块,并沿调用栈向上传播异常,直到找到处理器。若无处理器,程序终止并打印回溯。
考虑调用链:A 调用 B,B 调用 C。若 C 引发异常且未在本地处理,异常冒泡至 B 再至 A。未处理异常导致程序突然崩溃。
在 Python 中捕获异常
拦截异常,将可能不安全的代码放入 try 块。except 子句包含异常发生时执行的逻辑。
下面简洁示例演示流程:
# 导入 sys 模块以检查异常类型
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
输出
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5
代码遍历 random_list。若转 int 或除法失败,except 块处理错误、记录日志并继续下一项。成功转换时跳出循环并打印倒数。
因所有内置异常继承自 Exception,可通用捕获:
# 导入 sys 模块以检查异常类型
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
输出相同,但处理器通过 e.__class__ 引用具体异常类。
在 Python 中捕获特定异常
宽泛捕获所有异常可能掩盖 bug 并增加调试难度。应仅列出预期的异常类型。
try 块可包含多个 except 子句;仅首个匹配子句执行。示例:
try:
# 可能引发错误的代码
pass
except ValueError:
# 处理 ValueError
pass
except (TypeError, ZeroDivisionError):
# 处理 TypeError 或 ZeroDivisionError
pass
except Exception:
# 兜底处理其他异常
pass
在 Python 中引发异常
除自动异常外,开发者可用 raise 语句显式引发错误。可选传递消息说明原因。
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("This is an argument") # Traceback: MemoryError: This is an argument
try:
a = int(input("Enter a positive integer: "))
if a <= 0:
raise ValueError("That is not a positive number!")
except ValueError as ve:
print(ve)
Python try 与 else 子句
可选 else 子句仅在 try 块无异常完成时运行。此模式将成功路径代码与错误处理分离。
示例:打印偶数的倒数。
# 程序打印偶数的倒数
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1 / num
print(reciprocal)
输入奇数时输出:
Enter a number: 1 Not an even number!
输入偶数时输出:
Enter a number: 4 0.25
注意若 num 为零,ZeroDivisionError 在 else 块中引发,不会被前面的 except 捕获。
Python try…finally
finally 子句保证清理代码无论是否发生异常都运行。处理文件、网络连接或 GUI 等外部资源时必不可少。
文件处理典型用法:
try:
f = open("test.txt", encoding='utf-8')
# 执行文件操作
finally:
f.close()
文件总会被关闭,即使处理过程中出错。
Python
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- C++ 异常处理实战:try、catch、throw 完整指南与示例
- Python关键字与标识符:掌握保留字与命名规范
- Python语句、缩进与注释:清晰指南
- Python变量、常量与字面量完全指南
- 精通Python类型转换与强制转换:综合指南
- 精通Python输入输出与模块导入:实战指南
- 精通Python Pass语句:实战指南
- 理解Python全局、局部与非局部变量
- 精通 Python 目录与文件操作
- 精通 Python 异常处理:try、except、else 与 finally 详解
- 精通 Python 异常处理:try、except、finally 与 raise 高效用法