面试题答案
一键面试设计思路
- 层次化异常处理:按照交易处理步骤的先后顺序,在每个步骤对应的函数调用处使用
try - except
块来捕获特定类型的异常。这样可以针对不同步骤的异常进行针对性处理,而不会让异常在整个程序中无控制地传播。 - 性能优化:减少不必要的异常捕获,只在可能引发异常的地方进行捕获。同时,避免在
try
块中放置过多的非必要代码,以免影响性能。 - 资源合理释放:对于数据库连接等资源,使用
with
语句来确保在操作完成后自动释放资源,无论是否发生异常。
核心代码片段
import sqlite3
import requests
def validate_balance(user_id, amount):
# 模拟验证用户账户余额,可能引发余额不足异常
balance = 1000 # 假设初始余额
if amount > balance:
raise ValueError("余额不足")
return True
def update_transaction_record(user_id, amount):
with sqlite3.connect('finance.db') as conn:
cursor = conn.cursor()
# 假设存在一个表 transactions (user_id, amount, timestamp)
cursor.execute('INSERT INTO transactions (user_id, amount, timestamp) VALUES (?,?, datetime("now"))',
(user_id, amount))
conn.commit()
def notify_user(user_id, message):
try:
# 模拟通知用户,可能引发网络异常
response = requests.post(f'http://notify_service/user/{user_id}', json={'message': message})
response.raise_for_status()
except requests.RequestException as e:
print(f"通知用户时发生网络异常: {e}")
def process_transaction(user_id, amount):
try:
if validate_balance(user_id, amount):
try:
update_transaction_record(user_id, amount)
try:
notify_user(user_id, f"您的交易已成功,金额为 {amount}")
except Exception as e:
print(f"通知用户步骤发生异常: {e}")
except sqlite3.Error as e:
print(f"更新交易记录时发生数据库写入异常: {e}")
except ValueError as e:
print(f"验证用户账户余额时发生异常: {e}")
你可以通过以下方式调用这个函数:
process_transaction(1, 1500) # 假设用户ID为1,交易金额为1500