背景
公司有一个用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)
原因追查
- 错误表明在/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. 在可能报错的地方打印日志,发现确实是腾讯云抛出了汉字异常: 该可用区