fix: добавить add_done_callback в Scheduler._task

Если _scheduler_loop завершится с неожиданной ошибкой
(не CancelledError), это теперь залогировано через
_on_task_done callback. Штатное завершение через cancel()
пропускается без логов.
This commit is contained in:
deadzilla 2026-07-22 22:28:13 +05:00
parent 81a99aaeab
commit 8b59ddb0c9

View File

@ -157,8 +157,21 @@ class Scheduler:
return return
self._running = True self._running = True
self._task = asyncio.create_task(self._scheduler_loop()) self._task = asyncio.create_task(self._scheduler_loop())
self._task.add_done_callback(self._on_task_done)
logger.info("Планировщик запущен (время: %s)", self.morning_time) logger.info("Планировщик запущен (время: %s)", self.morning_time)
def _on_task_done(self, task: asyncio.Task) -> None:
"""Логировать нештатное завершение task.
CancelledError штатное завершение при stop(), поэтому пропускается.
Любое другое исключение признак ошибки в _scheduler_loop.
"""
if task.cancelled():
return
exc = task.exception()
if exc and not isinstance(exc, asyncio.CancelledError):
logger.error("Scheduler завершился с ошибкой: %s", exc)
def _stop_scheduler(self): def _stop_scheduler(self):
if self._task and not self._task.done(): if self._task and not self._task.done():
self._task.cancel() self._task.cancel()