调用Celery apply_async方法报错:Exception information must be have exception type
问题排查:Celery报错“Exception information must have exception type”
核心原因分析
1. 部分异常捕获后未重新抛出
在任务的try-except块中,ScriptExecutionException、UnknownExecutionException、ValueError这三类异常被捕获后,仅执行了状态更新和日志记录,但未重新抛出异常。Celery要求任务执行失败时必须抛出明确的异常对象,否则无法生成包含异常类型的失败信息,从而触发该报错。
示例问题代码片段:
except ScriptExecutionException as exc_e: self.update_state(state='FAILURE', meta={'message': "任务失败"}) logger.error(f"返回状态码:FAILURE") logger.exception(f"任务失败:{exc_e}") # 缺少抛出异常的逻辑
2. 自定义异常类未正确继承父类初始化逻辑
自定义的ScriptPreparationException和TaskExecuteCeleryException在__init__方法中仅初始化了self.message,但未调用父类Exception的初始化方法(super().__init__(message))。这会导致异常对象缺少父类提供的标准属性,可能干扰Celery对异常的序列化处理,间接引发错误。
示例问题代码片段:
class ScriptPreparationException(Exception): def __init__(self, message): self.message = message # 未调用父类初始化方法
修复方案
- 补全异常抛出逻辑:在捕获
ScriptExecutionException、UnknownExecutionException、ValueError后,添加重新抛出异常的代码:
except ScriptExecutionException as exc_e: self.update_state(state='FAILURE', meta={'message': "任务失败"}) logger.error(f"返回状态码:FAILURE") logger.exception(f"任务失败:{exc_e}") raise exc_e # 新增抛出异常逻辑
- 修正自定义异常类的初始化:在自定义异常的
__init__中调用父类初始化方法:
class ScriptPreparationException(Exception): def __init__(self, message): super().__init__(message) self.message = message def __str__(self): return f"脚本执行前准备异常: {self.message}" class TaskExecuteCeleryException(Exception): def __init__(self, message): super().__init__(message) self.message = message def __str__(self): return f"任务执行celery层面异常: {self.message}"
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

