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
.