Python 异常处理机制详解
基础异常处理
try 语句用于捕获和处理程序执行期间可能发生的异常。
def divide_numbers(a, b):
try:
result = a / b
return result
except ZeroDivisionError:
return "除数不能为零"
print(divide_numbers(10, 0))
多重异常处理
根据不同的异常类型执行不同的处理逻辑。
def process_user_input():
try:
user_input = input("请输入一个数字")
number = int(user_input)
result = 100 / number
return result
except ValueError:
return "输入必须是数字"
except ZeroDivisionError:
return "输入不能为零"
except Exception as error:
return f"发生未知错误{str(error)}"
资源清理操作
finally 块确保资源得到正确释放。
def read_file_content(filename):
try:
with open(filename, 'r') as file:
content = file.read()
return content
except FileNotFoundError:
return "文件不存在"
except PermissionError:
return "没有操作权限"
except Exception as error:
return f"操作失败{str(error)}"
自定义异常类
创建应用特定的异常类型。
class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.deficit = amount - balance
super().__init__(f"余额不足,当前余额{balance},需要{amount},差额{self.deficit}")
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
return self.balance
异常链处理
保留异常上下文信息。
def validate_data(data):
try:
process_data(data)
except ValueError as error:
raise ValidationError("数据验证失败") from error
def process_data(data):
if not isinstance(data, dict):
raise ValueError("数据必须是字典类型")
上下文管理
使用 with 语句简化资源管理。
class DatabaseConnection:
def __init__(self, connection_string):
self.connection_string = connection_string
def __enter__(self):
print("连接数据库")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("关闭数据库连接")
with DatabaseConnection("mysql://localhost:3306") as db:
print("执行数据库操作")
调试辅助
使用 assert 语句进行调试。
def calculate_discount(price, rate):
assert 0 <= rate <= 1, "折扣率必须在0到1之间"
assert price > 0, "价格必须大于0"
return price * (1 - rate)