Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions pybit/_http_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

from datetime import datetime as dt, timezone

from .exceptions import FailedRequestError, InvalidRequestError
from .exceptions import FailedRequestError, InvalidRequestError, RetryableError
from . import _helpers

# Requests will use simplejson if available.
Expand Down Expand Up @@ -201,6 +201,9 @@ def _submit_request(self, method=None, path=None, query=None, auth=False):
self._handle_network_error(e, retries_attempted)
except JSONDecodeError as e:
self._handle_json_error(e, retries_attempted)
except RetryableError as e:
self._handle_retryable_error(e.response, e.status_code, e.message, recv_window)


raise FailedRequestError(
request=f"{method} {path}: {req_params}",
Expand Down Expand Up @@ -275,8 +278,11 @@ def _handle_response(self, response, method, path, params, recv_window, retries_
error_msg = f"{s_json[ret_msg]} (ErrCode: {error_code})"

if error_code in self.retry_codes:
self._handle_retryable_error(response, error_code, error_msg, recv_window)
raise Exception("Retryable error occurred, retrying...")
raise RetryableError(
response=response,
message=error_msg,
status_code=error_code
)

if error_code not in self.ignore_codes:
raise InvalidRequestError(
Expand Down
18 changes: 18 additions & 0 deletions pybit/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,21 @@ def __init__(self, request, message, status_code, time, resp_headers):
f"{message} (ErrCode: {status_code}) (ErrTime: {time})"
f".\nRequest → {request}."
)


class RetryableError(Exception):
"""
Exception raised for retryable bybit error code

Attributes:
response -- Response object
message -- Explanation of the error.
status_code -- The code number returned.
"""

def __init__(self, response, message, status_code):
self.response = response
self.message = message
self.status_code = status_code

super().__init__(f"{message} (ErrCode: {status_code})")
Loading