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