模式切换
异常处理
异常的捕获与处理
try-except
语句
try
: 尝试执行可能产生异常的代码。except
: 捕获异常,并执行对应的代码。else
: 如果没有异常发生,执行else
代码块。finally
: 不论是否发生异常,finally
代码块都会执行,常用于资源释放。
python
try:
# 可能发生异常的代码
x = 10 / 0
except ZeroDivisionError:
# 捕获指定的异常
print("Cannot divide by zero.")
else:
# 如果没有异常,执行此块
print("Division successful.")
finally:
# 无论是否有异常,都会执行
print("This block always runs.")
输出:
Cannot divide by zero.
This block always runs.
异常的层次结构
Python 中的异常是基于类的,所有异常类都继承自 BaseException
。常用异常类包括:
Exception
: 大多数常见异常的基类。ZeroDivisionError
: 除以零时引发。ValueError
: 函数接收到正确类型但不适合的值时引发。TypeError
: 传递给函数或操作的对象类型不正确时引发。
异常的层次结构可以帮助你捕获特定的异常,也可以捕获所有异常。
python
try:
x = int("abc") # 触发 ValueError
except ValueError as ve:
print(f"Caught a ValueError: {ve}")
except Exception as e:
print(f"Some other exception occurred: {e}")
自定义异常
如果需要更精确地控制异常,可以自定义异常类,继承自 Exception
类。
python
# 自定义异常类
class InvalidAgeError(Exception):
def __init__(self, age, message="Invalid age provided"):
self.age = age
self.message = message
super().__init__(self.message)
# 使用自定义异常
def check_age(age):
if age < 0 or age > 120:
raise InvalidAgeError(age)
else:
print("Valid age.")
try:
check_age(-5)
except InvalidAgeError as e:
print(f"Error: {e}")
输出:
Error: Invalid age provided
资源管理
资源管理指的是确保在程序使用完资源后,及时正确地释放资源,如文件、网络连接等。
finally
语句
finally
块无论是否出现异常,都会执行,通常用于清理操作,例如关闭文件、释放连接等。
python
try:
file = open('example.txt', 'r')
# 进行文件操作
except FileNotFoundError:
print("File not found.")
finally:
file.close() # 无论是否发生异常,都关闭文件
with
语句与上下文管理
with
语句用于简化资源管理,它自动管理资源的获取和释放。常用于文件操作、数据库连接等场景。
with
语句的对象必须实现__enter__
和__exit__
方法,也称为上下文管理协议。- 在
with
块中,如果没有异常发生,__exit__
方法在块结束时自动调用;如果发生异常,__exit__
方法仍然会被调用,来执行清理工作。
python
# 使用with语句自动关闭文件
with open('example.txt', 'r') as file:
data = file.read()
print(data)
# 不需要手动调用 file.close(),with块结束时文件会自动关闭
自定义上下文管理器:
python
class MyResource:
def __enter__(self):
print("Resource acquired.")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Resource released.")
# 使用上下文管理
with MyResource():
print("Using resource.")
输出:
Resource acquired.
Using resource.
Resource released.
总结
- 异常处理 通过
try-except
捕获和处理运行时错误,避免程序崩溃。 - 层次结构 帮助我们有针对性地捕获异常。
- 自定义异常 可以创建符合业务逻辑的异常类型,提供更灵活的异常处理机制。
- 资源管理 中的
finally
和with
语句可以确保资源正确释放,with
是资源管理的推荐方式。