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
相关产品推荐
相关产品推荐

