From 7a8c9e66d9c43a539fb78107ce3f51f16c7f30a2 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Sat, 27 Jul 2019 23:07:48 -0400 Subject: [PATCH] [tasks] Add Loop.exception for more reliable exception retrieval. --- discord/ext/tasks/__init__.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/discord/ext/tasks/__init__.py b/discord/ext/tasks/__init__.py index 9d0e46bbe..6a7c9437c 100644 --- a/discord/ext/tasks/__init__.py +++ b/discord/ext/tasks/__init__.py @@ -40,6 +40,7 @@ class Loop: self._is_being_cancelled = False self._has_failed = False self._stop_next_iteration = False + self._exception = None if self.count is not None and self.count <= 0: raise ValueError('count must be greater than 0 or None.') @@ -81,8 +82,9 @@ class Loop: except asyncio.CancelledError: self._is_being_cancelled = True raise - except Exception: + except Exception as e: self._has_failed = True + self._exception = e log.exception('Internal background task failed.') raise finally: @@ -91,6 +93,7 @@ class Loop: self._current_loop = 0 self._stop_next_iteration = False self._has_failed = False + self._exception = None def __get__(self, obj, objtype): if obj is None: @@ -255,6 +258,16 @@ class Loop: """ return self._has_failed + def exception(self): + """Optional[:class:`Exception`]: The exception that the internal task failed with. + + .. versionadded:: 1.3.0 + """ + if self._exception is not None: + return self._exception + if self._task is not None: + return self._task.exception() + def before_loop(self, coro): """A decorator that registers a coroutine to be called before the loop starts running.