Handle errors for every requestΒΆ
By default peony.exceptions.RateLimitExceeded is handled by sleeping until
the rate limit resets and the requests are resent on asyncio.TimeoutError.
If you would handle these exceptions differently or want to handle other
exceptions you can use the error_handler argument of
PeonyClient.
import asyncio
import async_timeout
import sys
import aiohttp
from peony import PeonyClient, ErrorHandler
# client using application-only authentication
backup_client = PeonyClient(**creds, auth=peony.oauth.OAuth2Headers)
class MyErrorHandler(ErrorHandler):
"""
try to use backup_client during rate limits
retry requests three times before giving up
"""
def __init__(self, request):
# this will set the request as self.request (REQUIRED)
super().__init__(request)
self.tries = 0
@ErrorHandler.handle(exceptions.RateLimitExceeded)
async def handle_rate_limits(self):
""" Retry the request with another client on RateLimitExceeded """
self.request.client = backup_client
return ErrorHandler.RETRY
# You can handle several requests with a single method
@ErrorHandler.handle(asyncio.TimeoutError, TimeoutError)
async def handle_timeout_error(self):
""" retry the request on TimeoutError """
return ErrorHandler.RETRY
@ErrorHandler.handle(Exception)
async def default_handler(self, exception):
""" retry on other """
print("exception: %s" % exception)
self.tries -= 1
if self.tries > 0:
return ErrorHandler.RETRY
else:
return ErrorHandler.RAISE
# NOTE: client.api.statuses.home_timeline.get(_tries=5) should try
# the request 5 times instead of 3
async def __call__(self, tries=3, **kwargs):
self.tries = tries
await return super().__call__(**kwargs)
client = PeonyClient(**creds, error_handler=MyErrorHandler)
Your error handler must inherit from ErrorHandler
For every exception that you want you want to handle you should create
a method decorated by handle().
This method can return utils.ErrorHandler.RETRY if you want another
request to be made. By default a function with no return statement will raise
the exception, but you can explicitly raise the exception by returning
utils.ErrorHandler.RAISE.
Note
You can also choose to not use an error handler and disable the default one
by setting the error_handler argument to None.
If you want to disable the global error handling for a specific request
pass a _error_handling argument to this request with a value of
False.