2017-01-04 4 views
2

私はこの単純なセロリのタスクがあります。セロリは間違って例外を伝播し

@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

代替ソリューションが見つかりましたか?私は同じ正確な問題を偶然見つけました。 – lec00q

答えて

0

この問題については、トラッカーにバグがあります。それは例外をシリアライズし、それを確実にデシリアライズできないセラーと関係があります。

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

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

彼らはそれを修正しませんようにそれが表示されます。私が思いついた、見苦しい、完全なひどい回避策は、例外クラスの名前を調べることでした。

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