我有这个简单的芹菜任务:
@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'
答案 0 :(得分:1)
此问题的跟踪器中存在错误。它与Celery序列化异常并且无法可靠地反序列化有关。
https://github.com/celery/celery/issues/3586
https://github.com/celery/celery/issues/3758
似乎他们无法修复它。我提出的有点不雅观和完整的可怕解决方法只是检查异常类的名称。
if e.__class__.__name__ == "MyUniquelyNamedException":
...
else:
raise