Заработало.
Переписал заголовок описания handler'а сигнала в виде:
@task_failure.connect
def task_failure_handler(sender=None, task_id=None, exception=None, args=None, kwargs=None, traceback=None, einfo=None, **kwds):
Начало работать. Но полезли ошибки. Конечно, первая была про ту тестовую строчку ppp=ttt, но потом нашел еще несколько ошибок.
Если кому пригодится, полный текст получившегося handler'а выглядит так:
@task_failure.connect
def task_failure_handler(sender=None, task_id=None, exception=None, args=None, kwargs=None, traceback=None, einfo=None, **kwds):
if Contragents.objects.filter(id=args[0].id).exists():
c = Contragents.objects.get(id=args[0].id)
c.error_sending = exception.__str__()
c.save()
Он перехватывает ошибку, из аргументов самого таска берет первый (это объект модели Contragents) и заносит текстовое описание ошибки в специальное поле, для того чтобы клиент мог увидеть, что за ошибка и исправить ее.