MST

星途 面试题库

面试题:Python复杂业务场景下try - except块嵌套的优化

假设你正在开发一个金融交易系统,在处理交易时,有多个步骤,如验证用户账户余额(可能引发余额不足异常)、更新交易记录(可能引发数据库写入异常)、通知用户(可能引发网络异常)。这些步骤在不同的函数中实现,并且存在函数嵌套调用关系。请使用try - except块的嵌套结构来处理这些异常,同时要考虑异常处理的性能优化和资源合理释放(例如数据库连接)。请详细描述你的设计思路,并编写核心代码片段展示异常处理逻辑。
49.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 层次化异常处理:按照交易处理步骤的先后顺序,在每个步骤对应的函数调用处使用try - except块来捕获特定类型的异常。这样可以针对不同步骤的异常进行针对性处理,而不会让异常在整个程序中无控制地传播。
  2. 性能优化:减少不必要的异常捕获,只在可能引发异常的地方进行捕获。同时,避免在try块中放置过多的非必要代码,以免影响性能。
  3. 资源合理释放:对于数据库连接等资源,使用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