You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python能否在try块内评估多个条件?附场景代码求优化方案

问题解答:Python try块中评估多个条件及代码优化

核心问题回答

完全可以在一个try块中执行多个操作、评估多个条件,通过多分支except捕获不同场景的异常,搭配else块执行正常逻辑,这是Python异常处理的标准用法。

针对你的场景的优雅实现方案

你的需求包含两个关键校验点:SQL连接/查询15秒超时限制、DataFrame非空校验,下面是重构后的代码,解决了原代码中重复冗余、异常定义模糊、逻辑分散的问题:

1. 定义自定义异常

为了清晰区分不同错误场景,自定义专属异常,让代码可读性更强:

class SQLTimeoutError(Exception):
    """SQL连接或查询超时异常"""
    pass

class EmptyDataFrameError(Exception):
    """DataFrame为空异常"""
    pass

2. 封装通用数据库连接函数

避免重复编写连接代码,统一配置超时参数:

import pyodbc
import pandas as pd

def get_db_connection(timeout=15):
    """获取SQL Server数据库连接,自带超时控制"""
    server = '' 
    username = '' 
    password = '' 
    database = ''
    # 使用字符串格式化拼接连接串,更易维护
    conn_str = (
        'DRIVER={ODBC Driver 17 for SQL Server};'
        'SERVER={server};'
        'DATABASE={database};'
        'ENCRYPT=yes;'
        'UID={username};'
        'PWD={password}'
    ).format(server=server, database=database, username=username, password=password)
    
    try:
        # 连接时直接指定超时时间
        cnxn = pyodbc.connect(conn_str, timeout=timeout)
        return cnxn
    except pyodbc.Error as e:
        # 将数据库原生错误转为自定义超时异常抛出
        raise SQLTimeoutError(f"数据库连接/查询超时或失败: {str(e)}") from e

3. 封装读取DataFrame的函数

整合连接、查询、空表校验逻辑,不符合要求时抛出异常:

def read_table_to_df(table_name, timeout=15):
    """读取指定表到DataFrame,空表则抛出异常"""
    # 使用with语句自动管理连接,无需手动关闭
    with get_db_connection(timeout=timeout) as cnxn:
        df = pd.read_sql(f'SELECT * FROM {table_name}', cnxn)
    
    if df.empty:
        raise EmptyDataFrameError(f"表[{table_name}]查询结果为空")
    return df

4. 主逻辑统一用一个try块处理所有校验

把两个DataFrame的读取操作放在同一个try块中,一次捕获两类异常:

def main():
    try:
        # 读取两个目标表的DataFrame,触发超时或空表都会抛出对应异常
        df1 = read_table_to_df('table1', timeout=15)
        df2 = read_table_to_df('table2', timeout=15)
    except SQLTimeoutError as e:
        print(f"错误处理:{e}")
        # 执行超时后的退出逻辑,比如终止程序
        return
    except EmptyDataFrameError as e:
        print(f"错误处理:{e}")
        # 执行空表后的退出逻辑
        return
    else:
        # 所有校验通过,执行后续业务逻辑
        print("所有数据校验通过,开始执行核心逻辑")
        # 你的业务代码写在这里,比如数据合并、分析等

if __name__ == "__main__":
    main()

优化点说明

  • 代码复用:将重复的连接代码封装成独立函数,避免冗余,后期修改配置只需改一处
  • 异常清晰:自定义异常让错误场景区分明确,except分支处理更精准
  • 资源安全:用with语句自动管理数据库连接,避免资源泄漏
  • 逻辑紧凑:一个try块覆盖所有需要校验的操作,流程更清晰易懂

内容的提问来源于stack exchange,提问作者SanjanaSanju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:35:15