跳到主要内容

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)