Правильный способ отловить ошибки API krakenex
Мой первый опыт работы с API krakenex несколько разочаровывает, мой код часто дает сбой из-за ошибок, возвращаемых методами API. Понятно, что я должен создать надежный код, который может правильно отлавливать ошибки.
Следующие ошибки часто происходят:
>>> krapi.query_private('CancelOrder', {'txid':'OXGFZA-DTGGU-N3POM6'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "krakenex/api.py", line 122, in query_private
return self._query(urlpath, req, conn, headers)
File "krakenex/api.py", line 82, in _query
ret = conn._request(url, req, headers)
File "krakenex/connection.py", line 65, in _request
response = self.conn.getresponse()
File "/usr/lib64/python2.7/httplib.py", line 1121, in getresponse
response.begin()
File "/usr/lib64/python2.7/httplib.py", line 438, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python2.7/httplib.py", line 394, in _read_status
line = self.fp.readline(_MAXLINE + 1)
File "/usr/lib64/python2.7/socket.py", line 480, in readline
data = self._sock.recv(self._rbufsize)
File "/usr/lib64/python2.7/ssl.py", line 766, in recv
return self.read(buflen)
File "/usr/lib64/python2.7/ssl.py", line 653, in read
v = self._sslobj.read(len)
ssl.SSLError: ('The read operation timed out',)
>>> krapi.query_private('CancelOrder', {'txid':'OXGFZA-DTGGU-N3POM6'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "krakenex/api.py", line 122, in query_private
return self._query(urlpath, req, conn, headers)
File "krakenex/api.py", line 83, in _query
return json.loads(ret)
File "/usr/lib64/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
>>> krapi.query_private('CancelOrder', {'txid':'OXGFZA-DTGGU-N3POM6'})
{u'result': {u'count': 1}, u'error': []}
Честно говоря, я не знаю, что я делаю, потому что это совершенно новая тема для меня. Вот код, который я придумал до сих пор:
import sys
import ssl
import time
import krakenex
krapi = krakenex.API()
krapi.load_key('krakenex.key')
while True:
try:
krapi.query_private('CancelOrder', {'txid':'OXGFZA-DTGGU-N3POM6'})
break
except ValueError:
print "Oops! ValueError..."
print sys.exc_info()[1]
except ssl.SSLError:
print "Oops! ssl.SSLError..."
print sys.exc_info()[1]
finally:
sys.exc_clear()
time.sleep(1)
Я хотел бы избежать катастрофического события, которое в этом случае означало бы, что заказ никогда не будет отменен. Намерение состоит в том, чтобы повторять запрос, пока он не будет успешно выполнен (я знаю, идентификатор заказа жестко запрограммирован, он будет заменен переменной позже...).
Это правильный способ обработки таких исключений?
А может, здесь чего-то не хватает?
Может быть, может быть предложено более питоническое решение?