Почему сельдерей НЕ выбрасывает исключение, когда основная задача бросает один
Сельдерей, похоже, неправильно обрабатывает исключения.
Если у меня есть задача:
def errorTest():
raise Exception()
а затем я вызываю
r = errorTest.delay()
In [8]: r.result
In [9]: r.state
Out[9]: 'PENDING'
И он будет вешать так бесконечно.
Проверка и проверка журналов показывает, что ошибка возникает в задаче (и если вы хотите получить сообщение, спросите), и я знаю, что бэкэнд и все настроено правильно, потому что другие задачи просто работают и возвращают результаты правильно,
Есть ли что-то напуганное, что мне нужно сделать, чтобы поймать исключения в сельдерей?
/Версия для сельдерея 3.0.13, брокер RabbitMQ работает на моей локальной машине
Ответы
Ответ 1
Вы можете определить on_failure
в своем подклассе Task
, чтобы правильно их обрабатывать. Если вы просто хотите узнать, что произошло, вы можете настроить уведомления об ошибках электронной почты, которые отправят вам трассировку стека в вашей конфигурации celery.
Ответ 2
Если вы используете Celery с параметром CELERY_ALWAYS_EAGER равным True, убедитесь, что вы также включили эту строку в свои настройки:
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
http://docs.celeryproject.org/en/latest/configuration.html#celery-eager-propagates-exceptions
Ответ 3
Переход на @primalpython ответ более явный.
Это не удастся:
@task
def error():
raise Exception
Input/Output:
In [7]: r = error.delay()
In [8]: print r.state
Out[8]: 'PENDING'
In [9]: print r.result
Out[9]: None
Это будет успешным:
@task
def error():
raise Exception
def on_failure(self, *args, **kwargs):
pass
Input/Output:
In [7]: r = error.delay()
In [8]: print r.state
Out[8]: 'FAILURE'
In [9]: print r.result
Out[9]: Exception()