|
31 | 31 | ChosenInlineResultHandler, |
32 | 32 | DeletedMessagesHandler, |
33 | 33 | EditedMessageHandler, |
| 34 | + ErrorHandler, |
34 | 35 | InlineQueryHandler, |
35 | 36 | MessageHandler, |
36 | 37 | PollHandler, |
@@ -79,6 +80,7 @@ def __init__(self, client: "hydrogram.Client"): |
79 | 80 | self.updates_queue = asyncio.Queue() |
80 | 81 | self.groups = OrderedDict() |
81 | 82 | self._init_update_parsers() |
| 83 | + self.error_handlers = [] |
82 | 84 |
|
83 | 85 | def _init_update_parsers(self): |
84 | 86 | self.update_parsers = { |
@@ -160,24 +162,38 @@ async def stop(self): |
160 | 162 | await asyncio.gather(*self.handler_worker_tasks) |
161 | 163 | self.handler_worker_tasks.clear() |
162 | 164 | self.groups.clear() |
| 165 | + self.error_handlers.clear() |
| 166 | + |
163 | 167 | log.info("Stopped %s HandlerTasks", self.client.workers) |
164 | 168 |
|
165 | 169 | def add_handler(self, handler, group: int): |
166 | 170 | async def fn(): |
167 | 171 | async with asyncio.Lock(): |
168 | | - if group not in self.groups: |
169 | | - self.groups[group] = [] |
170 | | - self.groups = OrderedDict(sorted(self.groups.items())) |
171 | | - self.groups[group].append(handler) |
| 172 | + if isinstance(handler, ErrorHandler): |
| 173 | + if handler not in self.error_handlers: |
| 174 | + self.error_handlers.append(handler) |
| 175 | + else: |
| 176 | + if group not in self.groups: |
| 177 | + self.groups[group] = [] |
| 178 | + self.groups = OrderedDict(sorted(self.groups.items())) |
| 179 | + self.groups[group].append(handler) |
172 | 180 |
|
173 | 181 | self.loop.create_task(fn()) |
174 | 182 |
|
175 | 183 | def remove_handler(self, handler, group: int): |
176 | 184 | async def fn(): |
177 | 185 | async with asyncio.Lock(): |
178 | | - if group not in self.groups: |
179 | | - raise ValueError(f"Group {group} does not exist. Handler was not removed.") |
180 | | - self.groups[group].remove(handler) |
| 186 | + if isinstance(handler, ErrorHandler): |
| 187 | + if handler not in self.error_handlers: |
| 188 | + raise ValueError( |
| 189 | + f"Error handler {handler} does not exist. Handler was not removed." |
| 190 | + ) |
| 191 | + |
| 192 | + self.error_handlers.remove(handler) |
| 193 | + else: |
| 194 | + if group not in self.groups: |
| 195 | + raise ValueError(f"Group {group} does not exist. Handler was not removed.") |
| 196 | + self.groups[group].remove(handler) |
181 | 197 |
|
182 | 198 | self.loop.create_task(fn()) |
183 | 199 |
|
@@ -225,7 +241,23 @@ async def _handle_update(self, handler, handler_type, parsed_update, update, use |
225 | 241 | except hydrogram.ContinuePropagation: |
226 | 242 | pass |
227 | 243 | except Exception as e: |
228 | | - log.exception(e) |
| 244 | + handled_error = False |
| 245 | + for error_handler in self.error_handlers: |
| 246 | + try: |
| 247 | + if await error_handler.check(self.client, e): |
| 248 | + await error_handler.callback(self.client, e) |
| 249 | + handled_error = True |
| 250 | + break |
| 251 | + except hydrogram.StopPropagation: |
| 252 | + raise |
| 253 | + except hydrogram.ContinuePropagation: |
| 254 | + continue |
| 255 | + except Exception as e: |
| 256 | + log.exception(e) |
| 257 | + continue |
| 258 | + |
| 259 | + if not handled_error: |
| 260 | + log.exception(e) |
229 | 261 |
|
230 | 262 | async def _execute_callback(self, handler, *args): |
231 | 263 | if inspect.iscoroutinefunction(handler.callback): |
|
0 commit comments