在日常开发中,重试机制是提高代码健壮性的重要手段之一,尤其是在处理网络请求时,遇到超时或临时性错误的情况并不少见。通过重试,我们可以在一定程度上降低这些临时问题带来的影响。然而,如果使用不当,重试机制本身也可能引发新的问题,甚至让问题更加难以排查。
问题背景
在一次项目中,我遇到了一些在使用重试装饰器时引发的诡异问题。最初,我在一个 _request
方法上使用了 retry_on_exceptions
装饰器,意图是在请求超时时自动重试。但在某些特殊情况下,这个重试机制反而带来了新的异常,特别是当请求包含复杂的数据结构,如使用 aiohttp.FormData()
来模拟文件上传时。
问题代码示例
@retry_on_exceptions(exceptions=[asyncio.exceptions.TimeoutError, aiohttp.client_exceptions.ClientConnectorError])
async def _request(self, method, url, **kwargs):
...
...
async def upload(self):
data = aiohttp.FormData()
data.add_field('file', file_object, filename='your_file.txt')
self._request(&