2017-01-04 6 views
2

Ich habe diese einfache Sellerie Aufgabe:Sellerie propagiert falsch Ausnahmen

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

Und ich will die get Methode verwenden, um das Ergebnis zu erhalten, wenn meine Aufgabe schnell zu beenden passiert.

Aber anstelle der erwarteten eingebauten ValueError, bekomme ich die celery.backends.base.ValueError. Wie kann ich das Original ValueError in einem solchen Fall bekommen?

>>> 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

Haben Sie eine alternative Lösung gefunden? Ich bin auf dasselbe Problem gestoßen. – lec00q

Antwort

0

Es gibt einen Bug in ihrem Tracker für dieses Problem. Es hat damit zu tun, dass Sellerie die Exception serialisiert und sie nicht zuverlässig deserialisieren kann.

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

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

Es scheint, als wären sie es nicht beheben. Die etwas unansehnliche und komplette schreckliche Lösung, die ich mir ausgedacht hatte, bestand darin, nach dem Namen der Ausnahmeklasse zu suchen.

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