9、错误与异常处理
1. 异常处理基础
Python使用try
、except
、else
和finally
语句来处理异常。基本语法结构如下:
try:
# 可能产生异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定类型的异常
print("除零错误")
except Exception as e:
# 处理其他类型的异常
print(f"其他错误: {e}")
else:
# 没有异常时执行
print("代码执行成功")
finally:
# 无论是否有异常都会执行
print("清理工作")
2. 常见异常类型
# TypeError - 类型错误
try:
result = "42" + 42
except TypeError as e:
print(f"类型错误: {e}")
# ValueError - 值错误
try:
num = int("abc")
except ValueError as e:
print(f"值错误: {e}")
# FileNotFoundError - 文件未找到
try:
with open("不存在的文件.txt", "r") as f:
content = f.read()
except FileNotFoundError as e:
print(f"文件未找到: {e}")
3. 自定义异常
class CustomError(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
# 使用自定义异常
try:
raise CustomError("这是一个自定义错误")
except CustomError as e:
print(f"捕获自定义异常: {e}")
4. 异常链(Python 3.x)
try:
try:
result = 1 / 0
except ZeroDivisionError as e:
raise ValueError("无效的操作") from e
except ValueError as e:
print(f"错误信息: {e}")
print(f"原始错误: {e.__cause__}")
5. with语句和上下文管理
# 自动处理文件关闭
with open("example.txt", "w") as file:
file.write("Hello, World!")
# 文件会自动关闭,即使发生异常
6. 最佳实践
- 总是捕获具体的异常,而不是笼统的
Exception
- 在
except
块中提供有意义的错误信息 - 使用
finally
块进行清理工作 - 避免在
except
块中使用空pass
语句 - 合理使用异常层级,不要过度嵌套