Errors handler

This commit is contained in:
Alex Root Junior 2020-04-12 22:13:25 +03:00
parent 569a9c807c
commit 9e673998f0
9 changed files with 150 additions and 3 deletions

View file

@ -1,7 +1,18 @@
from __future__ import annotations
from itertools import chain
from typing import TYPE_CHECKING, Any, AsyncGenerator, Callable, Dict, Generator, List, Type
from typing import (
TYPE_CHECKING,
Any,
AsyncGenerator,
Callable,
Dict,
Generator,
List,
NoReturn,
Optional,
Type,
)
from pydantic import ValidationError
@ -17,6 +28,17 @@ class SkipHandler(Exception):
pass
class CancelHandler(Exception):
pass
def skip(message: Optional[str] = None) -> NoReturn:
"""
Raise an SkipHandler
"""
raise SkipHandler(message or "Event skipped")
class EventObserver:
"""
Base events observer

View file

@ -27,4 +27,5 @@ BUILTIN_FILTERS: Dict[str, Tuple[Type[BaseFilter], ...]] = {
"pre_checkout_query": (),
"poll": (),
"poll_answer": (),
"errors": (),
}

View file

@ -133,6 +133,11 @@ class BaseMiddleware(AbstractMiddleware):
Event that triggers before process poll_answer
"""
async def on_pre_process_error(self, exception: Exception, data: Dict[str, Any]) -> Any:
"""
Event that triggers before process error
"""
# =============================================================================================
# Event that triggers on process <event> after filters.
# =============================================================================================
@ -214,6 +219,11 @@ class BaseMiddleware(AbstractMiddleware):
Event that triggers on process poll_answer
"""
async def on_process_error(self, exception: Exception, data: Dict[str, Any]) -> Any:
"""
Event that triggers on process error
"""
# =============================================================================================
# Event that triggers after process <event>.
# =============================================================================================
@ -298,3 +308,10 @@ class BaseMiddleware(AbstractMiddleware):
"""
Event that triggers after processing poll_answer
"""
async def on_post_process_error(
self, exception: Exception, data: Dict[str, Any], result: Any
) -> Any:
"""
Event that triggers after processing error
"""

View file

@ -25,6 +25,7 @@ UpdateType = Union[
PreCheckoutQuery,
ShippingQuery,
Update,
BaseException,
]

View file

@ -48,6 +48,8 @@ class Router:
)
self.poll_handler = TelegramEventObserver(router=self, event_name="poll")
self.poll_answer_handler = TelegramEventObserver(router=self, event_name="poll_answer")
self.errors_handler = TelegramEventObserver(router=self, event_name="error")
self.middleware = MiddlewareManager(router=self)
self.startup = EventObserver()
@ -66,6 +68,7 @@ class Router:
"pre_checkout_query": self.pre_checkout_query_handler,
"poll": self.poll_handler,
"poll_answer": self.poll_answer_handler,
"error": self.errors_handler,
}
# Root handler
@ -291,6 +294,15 @@ class Router:
continue
raise SkipHandler
except SkipHandler:
raise
except Exception as e:
async for result in self.errors_handler.trigger(e, **kwargs):
return result
raise
finally:
if user_token:
User.reset_current(user_token)