发生binance api(连接)错误时无法继续程序
Posted
技术标签:
【中文标题】发生binance api(连接)错误时无法继续程序【英文标题】:Can't continue a program when binance api(connection) error occured 【发布时间】:2019-10-24 10:56:12 【问题描述】:我正在通过 AWS-EC2 上的 Binance api 从 Binance 获取 OHLCV 数据。 但是有时(几天一次)会出现错误“104,'ECONNRESET'”并且程序停止。
Python3.7.3编写的程序,运行在AWS-EC2上
代码如下。但是这段代码无法继续。
当发生任何 api 或连接错误时,我想继续运行程序。
我应该如何处理这个错误?
while True:
..............
try :
klines = client.get_historical_klines(ticker_symbol, Client.KLINE_INTERVAL_1MINUTE, _from_str, _until_str)
except BinanceAPIException as e:
print(e)
print('Something went wrong. Error occured at %s. Wait for 1 hour.' % (datetime.datetime.now().astimezone(timezone('UTC'))))
sleep(3600)
continue
..............
所有错误消息如下。
Traceback(最近一次调用最后一次): 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", 第 600 行,在 urlopen 中 chunked=chunked)文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py”, 第 384 行,在 _make_request 六.raise_from(e, None) File "", line 2, in raise_from File "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", 第 380 行,在 _make_request 中 httplib_response = conn.getresponse() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 1321 行,在 getresponse 中 response.begin() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 296 行,开始 版本、状态、原因 = self._read_status() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 257 行,在 _read_status line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/socket.py “, 线 第589章 返回 self._sock.recv_into(b) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py”, 第 312 行,在 recv_into 中 返回 self.recv_into(*args, **kwargs) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py”, 第 302 行,在 recv_into 中 引发 SocketError(str(e)) OSError: (104, 'ECONNRESET')
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/adapters.py", 第 449 行,在发送中 超时=超时文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py”, 第 638 行,在 urlopen 中 _stacktrace=sys.exc_info()[2]) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/util/retry.py”, 第 368 行,增量 raise Six.reraise(type(error), error, _stacktrace) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/packages/six.py” , 第 685 行,在再加注中 raise value.with_traceback(tb) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py”, 第 600 行,在 urlopen 中 chunked=chunked)文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py”, 第 384 行,在 _make_request 六.raise_from(e, None) File "", line 2, in raise_from File "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/connectionpool.py", 第 380 行,在 _make_request 中 httplib_response = conn.getresponse() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 1321 行,在 getresponse 中 response.begin() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 296 行,开始 版本、状态、原因 = self._read_status() 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/http/client.py”, 第 257 行,在 _read_status line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/socket.py “, 线 第589章 返回 self._sock.recv_into(b) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py”, 第 312 行,在 recv_into 中 返回 self.recv_into(*args, **kwargs) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py”, 第 302 行,在 recv_into 中 raise SocketError(str(e)) urllib3.exceptions.ProtocolError: ('Connection aborted.', OSError("(104, 'ECONNRESET')")))
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件 “BTC_USDT_BINANCE_minutes.py”,第 54 行,在 klines = client.get_historical_klines(ticker_symbol, Client.KLINE_INTERVAL_1MINUTE, _from_str, _until_str) 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", 第 765 行,在 get_historical_klines 中 first_valid_ts = self._get_earliest_valid_timestamp(符号,间隔)文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", 第 723 行,在 _get_earliest_valid_timestamp endTime=None 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py”, 第 705 行,在 get_klines 中 return self._get('klines', data=params) 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", 第 207 行,在 _get return self._request_api('get', path, signed, version, **kwargs) 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", 第 181 行,在 _request_api 中 return self._request(method, uri, signed, **kwargs) File "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/binance/client.py", 第 175 行,在 _request 中 response = getattr(self.session, method)(uri, **kwargs) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/sessions.py ", 第 546 行,在获取 return self.request('GET', url, **kwargs) 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/sessions.py", 第 533 行,应要求提供 resp = self.send(prep, **send_kwargs) 文件“/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/sessions.py”, 第 646 行,在发送中 r = adapter.send(request, **kwargs) 文件 "/home/ec2-user/.pyenv/versions/3.7.3/lib/python3.7/site-packages/requests/adapters.py", 第 498 行,在发送中 raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', OSError("(104, 'ECONNRESET')"))
【问题讨论】:
【参考方案1】:假设您正在使用python-binance
模块,很可能会发生错误,因为您试图在很长一段时间后重用client
(服务器超时)。您可以先尝试重新创建client
:
...
client = Client(api_key, api_secret)
while True:
...
try :
klines = client.get_historical_klines(ticker_symbol, Client.KLINE_INTERVAL_1MINUTE, _from_str, _until_str)
except BinanceAPIException as e:
print(e)
print('Something went wrong. Error occured at %s. Wait for 1 hour.' % (datetime.datetime.now().astimezone(timezone('UTC'))))
sleep(3600)
client = Client(api_key, api_secret)
continue
...
原因是因为[Client][2]
使用requests
Session 下面暗示使用urllib3
的连接池。此连接池在超时后无法重用。
【讨论】:
感谢您的回答。我按照您的建议修改了我的代码。该程序已经运行了大约 5 天!但是一开始看到错误输出,没有输出打印代码“print(e)”&“print('Something go wrong.......”。我没有任何信心程序可以正确处理异常。如果您有任何进一步的想法,请告诉我。 如何尝试通过在本地计算机上运行异常来模拟异常,然后断开并重新连接互联网连接? 是的,我会试试的。谢谢!以上是关于发生binance api(连接)错误时无法继续程序的主要内容,如果未能解决你的问题,请参考以下文章
nghttp2 api.binance.com ssl 错误