使用@try_catch装饰器时Python函数报错后无响应,而非抛出错误
问题分析与解决
你的装饰器出现“仅挂起无报错”的问题,核心原因有两个:
- 裸
except:捕获了所有异常(包括系统级终止异常),且未重新抛出,导致程序异常被“吞掉”,后续流程因异常状态无法正常推进,看起来像是挂起。 - 未将具体异常信息传递给
Print_Error(),如果该函数需要依赖异常上下文输出报错细节,就无法生成有效报错信息。
修复后的装饰器代码
def try_catch(func): def wrapper(*args, **kwargs): try: res = func(*args, **kwargs) return res except Exception as e: # 替换裸except,避免捕获SystemExit等关键异常 Print_Error(e) # 将异常对象传入,让函数能输出具体错误 raise # 重新抛出异常,让程序感知错误并终止/处理 return wrapper
关键修改说明
- 替换裸
except为except Exception as e:避免捕获KeyboardInterrupt、SystemExit这类会终止程序的异常,防止程序无法正常退出。 - 传递异常对象给
Print_Error():让Print_Error()能获取错误类型、内容、栈信息,输出有效的报错详情。如果你的Print_Error()原本就依赖异常上下文,也可以在except块内直接调用,此时异常上下文仍存在。 - 添加
raise重新抛出异常:确保程序知道发生了错误,不会在异常被静默处理后继续执行无效逻辑,避免出现“挂起”现象。
补充:如果不需要重新抛出异常
如果你希望捕获异常后仅打印错误而不终止程序,至少要在Print_Error()里输出完整的异常栈信息,比如修改Print_Error():
import traceback def Print_Error(e=None): if e: print(f"错误信息: {str(e)}") traceback.print_exc() # 打印完整异常栈 else: traceback.print_exc()
内容的提问来源于stack exchange,提问作者Coden LX
相关产品推荐
相关产品推荐

