Tkinter捕获mainProcess全量异常并弹出成功/错误提示的实现方法
Tkinter mainProcess 全局异常捕获实现方案
直接用Python标准try/except/else结构包裹全量业务逻辑即可,能覆盖Excel读写、pandas运算、文件导出全链路的所有运行时错误,同时准确区分执行失败/成功两种场景弹出对应提示。
改造要点
- 所有业务逻辑放在
try块内,仅捕获继承自Exception的运行时异常,不会拦截系统退出、键盘中断这类系统级异常,避免程序无法正常关闭 - 异常触发时走
except分支,弹出带具体错误信息的错误提示 - 仅当
try块内代码全程无异常执行完毕时,才会走else分支弹出成功提示 - 修复原代码逻辑漏洞:文件名空值校验后增加
return终止流程,避免弹完空名提示后继续执行导出操作触发无意义报错
改造后完整代码
import traceback # 依赖前置说明:需提前导入pandas、numpy,且已将tkinter.messagebox导入为m_box def mainProcess(): try: df1 = pd.read_excel(fileA) # FILE TRANSAKSI BULANAN df2 = pd.read_excel(fileB) # FILE ADMIN TRANSAKSI df3 = pd.read_excel(fileC) # FILE AKHIR / INPUT # 计算Propose值 df1.rename(columns={'agent_id':'AGENT_ID'}, inplace=True) df1.rename(columns={'description':'Nama Produk'}, inplace=True) df4 = pd.merge(df1, df2[['Nama Produk', 'Nilai Propose']], on='Nama Produk', how='left') # 计算Agent固定输入值 df4 = df4.groupby(by="AGENT_ID").sum()[["Nilai Propose"]] df4["Korgen_40%"] = df4["Nilai Propose"] * 0.4 df4["Agent_60%"] = df4["Nilai Propose"] * 0.6 df4["Korlap_10%"] = df4["Agent_60%"] * 0.1 df4["Agent_Recieved"] = df4["Agent_60%"] - df4["Korlap_10%"] df4["Fix_Input_Agent"] = np.floor(df4["Agent_Recieved"]) df4.reset_index(inplace=True) # 数值写入目标文件 df5 = pd.merge(df3, df4[['AGENT_ID','Fix_Input_Agent']], on='AGENT_ID', how='left') df6 = df5['Fix_Input_Agent'].fillna(value=0) df3["TRANSFER_VALUE"] = df6 NamaFile1 = alterName1.get() NamaFile2 = alterName2.get() if NamaFile1 == '' or NamaFile2 == '': m_box.showerror('Caution', 'Nama File Tidak Boleh Kosong') return # 空文件名直接终止后续流程,避免无效执行 df4.to_excel(f"{NamaFile1}.xlsx", index=False) df3.to_excel(f"{NamaFile2}.xlsx", index=False) except Exception as e: # 错误提示带完整堆栈,方便定位问题 error_detail = f"执行出错:\n{str(e)}\n\n错误定位:\n{traceback.format_exc()}" m_box.showerror('执行失败', error_detail) else: m_box.showinfo('执行成功', 'Excel处理与导出已全部完成!')
注意事项
- 引入
traceback模块是为了在弹窗中直接展示错误的完整调用链,不用切回控制台翻日志就能快速定位问题(比如是源文件不存在、列名不匹配、文件被占用无写入权限等),如果不需要展示详细堆栈,直接在错误提示里放str(e)即可 - 禁止使用裸
except:写法,这种写法会捕获包括KeyboardInterrupt(Ctrl+C终止程序)、SystemExit(程序主动退出)在内的所有异常,会导致程序无法正常退出
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

