Подтвердить что ты не робот

Почему сельдерей НЕ выбрасывает исключение, когда основная задача бросает один

Сельдерей, похоже, неправильно обрабатывает исключения.

Если у меня есть задача:

def errorTest():
    raise Exception()

а затем я вызываю

r = errorTest.delay()
In [8]: r.result

In [9]: r.state
Out[9]: 'PENDING'

И он будет вешать так бесконечно.

Проверка и проверка журналов показывает, что ошибка возникает в задаче (и если вы хотите получить сообщение, спросите), и я знаю, что бэкэнд и все настроено правильно, потому что другие задачи просто работают и возвращают результаты правильно,

Есть ли что-то напуганное, что мне нужно сделать, чтобы поймать исключения в сельдерей?

/Версия для сельдерея 3.0.13, брокер RabbitMQ работает на моей локальной машине

4b9b3361

Ответ 1

Вы можете определить on_failure в своем подклассе Task, чтобы правильно их обрабатывать. Если вы просто хотите узнать, что произошло, вы можете настроить уведомления об ошибках электронной почты, которые отправят вам трассировку стека в вашей конфигурации celery.

Ответ 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()