Celery错误地传播异常

时间:2017-01-04 15:20:15

标签: python exception celery

我有这个简单的芹菜任务:

@celery.task
def test_exception():
    raise ValueError("foo")

如果我的任务碰巧快完成,我想使用get方法来获得结果。

但是,我得到ValueError而不是预期的内置celery.backends.base.ValueError。在这种情况下如何获得原始ValueError

>>> from tasks import test_exception
>>> try:
...     test_exception.delay().get()
... except ValueError as e:
...     print("Success: %s", str(e))
... except:
...     E=sys.exc_info()
...
>>> E
(<class 'celery.backends.base.ValueError'>, ValueError(u'foo',), <traceback object at 0x7f858c7f5ea8>)
>>> E[0].__module__
'celery.backends.base'

1 个答案:

答案 0 :(得分:1)

此问题的跟踪器中存在错误。它与Celery序列化异常并且无法可靠地反序列化有关。

https://github.com/celery/celery/issues/3586

https://github.com/celery/celery/issues/3758

似乎他们无法修复它。我提出的有点不雅观和完整的可怕解决方法只是检查异常类的名称。

if e.__class__.__name__ == "MyUniquelyNamedException":
    ...
else:
    raise