Retry Policy and Error Handling
RetryPolicy decouples retry decisions from the underlying tenacity logic.
The default implementation only retries for network errors raised by httpx.
You can implement your own strategy by inspecting imednet.core.retry.RetryState.
Handling exceptions
Use typed exceptions to respond to different failure modes:
from imednet import ImednetSDK
from imednet.core.exceptions import RateLimitError, ServerError, NotFoundError
sdk = ImednetSDK()
try:
sdk.studies.list()
except RateLimitError:
print("Too many requests, try again later")
except NotFoundError as exc:
print(f"Missing resource: {exc}")
except ServerError as exc:
print(f"Server error: {exc}")
Custom strategies
Retry policies decide if a request should be retried. To retry on
RateLimitError and ServerError:
from imednet.core.client import Client
from imednet.core.retry import RetryPolicy, RetryState
from imednet.core.exceptions import RateLimitError, ServerError
class RateLimitServerRetry(RetryPolicy):
def should_retry(self, state: RetryState) -> bool:
return isinstance(state.exception, (RateLimitError, ServerError))
client = Client(
api_key="A",
security_key="B",
retries=5,
backoff_factor=0.5,
retry_policy=RateLimitServerRetry(),
)
Logging and exponential backoff
Each attempt is logged with JSON formatting. Configure logging globally via
imednet.utils.configure_json_logging() or by supplying log_level when
constructing the client. Retries use exponential backoff with delays controlled
by retries and backoff_factor. With retries=5 and backoff_factor=0.5
the wait times are 0.5 s, 1 s, 2 s, 4 s, and 8 s.
Example script
The Custom Retry Script script demonstrates these concepts using a mock transport:
export IMEDNET_API_KEY=dummy
export IMEDNET_SECURITY_KEY=dummy
python examples/custom_retry.py