From 8ac383d757a6b6a2510f56075f8fb464e4051f4a Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Sat, 13 Aug 2016 14:19:03 +0100 Subject: [PATCH] wxIdleLoop absorbs errors thrown by tasks, prints a warning. --- fsl/utils/async.py | 18 +++++++++++++----- fsl/utils/notifier.py | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fsl/utils/async.py b/fsl/utils/async.py index 7ee46820d..ef79513ca 100644 --- a/fsl/utils/async.py +++ b/fsl/utils/async.py @@ -247,22 +247,30 @@ def _wxIdleLoop(ev): now = time.time() elapsed = now - task.schedtime queueSizeOffset = 0 + taskName = task.name + funcName = getattr(task.task, '__name__', '<unknown>') + + if taskName is None: taskName = funcName + else: taskName = '{} [{}]'.format(taskName, funcName) # Has enouggh time elapsed # since the task was scheduled? # If not, re-queue the task. if elapsed < task.after: - log.debug('Re-queueing function ({}) on wx idle ' - 'loop'.format(getattr(task.task, '__name__', '<unknown>'))) + log.debug('Re-queueing function ({}) on wx idle loop'.format(taskName)) _idleQueue.put_nowait(task) queueSizeOffset = 1 # Has the task timed out? elif task.timeout == 0 or (elapsed < task.timeout): - log.debug('Running function ({}) on wx idle ' - 'loop'.format(getattr(task.task, '__name__', '<unknown>'))) - task.task(*task.args, **task.kwargs) + log.debug('Running function ({}) on wx idle loop'.format(taskName)) + + try: + task.task(*task.args, **task.kwargs) + except Exception as e: + log.warning('Idle task {} crashed - {}: {}'.format( + taskName, type(e).__name__, str(e))) if task.name is not None: _idleQueueSet.discard(task.name) diff --git a/fsl/utils/notifier.py b/fsl/utils/notifier.py index c1a12e45d..5aef630df 100644 --- a/fsl/utils/notifier.py +++ b/fsl/utils/notifier.py @@ -14,7 +14,8 @@ import inspect import collections import props -import async + +import fsl.utils.async as async log = logging.getLogger(__name__) -- GitLab