python celery捕捉unicode字符类型的错误,导致后台任务失败的解决方案

本文描述了在使用Django 1.8.0和Celery 3.1.18的运维平台上,后台任务由于无法处理腾讯云抛出的Unicode异常而失败的问题。错误出现在Celery BaseBackend类的str()操作中。解决方案是提前捕获异常,将Unicode异常信息转换为str类型,确保on_failure函数能够正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

公司有一个用django(1.8.0)写的运维平台,目的用于申请阿里云和腾讯云机器;申请云上机器采用后台异步的方式,框架采用redis+celery(3.1.18),但最近发现一个问题,就是有时候申请腾讯云机器的后台任务因为没有捕捉到某些异常,导致任务会失败,无法正常进行on_failure处理,报错如下:
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)

原因追查

  1. 错误表明在/Library/Python/2.7/site-packages/celery/backends/base.py这个文件第164行
159     def prepare_exception(self, exc, serializer=None):
160         """Prepare exception for serialization."""
161         serializer = self.serializer if serializer is None else serializer
162         if serializer in EXCEPTION_ABLE_CODECS:
163             return get_pickleable_exception(exc)
164         return {'exc_type': type(exc).__name__, 'exc_message': str(exc)}

这个是celery BaseBackend类的方法,他对于exception执行了str()操作,结合报错是UnicodeEncodeError类型,应该是腾讯云抛出来unicode类型的异常信息,导致str()错误。
2. 在可能报错的地方打印日志,发现确实是腾讯云抛出了汉字异常: 该可用区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值