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

调用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  # 未调用父类初始化方法

修复方案

  1. 补全异常抛出逻辑:在捕获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  # 新增抛出异常逻辑
  1. 修正自定义异常类的初始化:在自定义异常的__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:11:12