diff --git a/fsl/utils/async.py b/fsl/utils/async.py
index 7ee46820da5566b1c345c5cf93ccad53014fad10..ef79513ca3ef454d301f29cd3d89e506b875f556 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 c1a12e45d837ce09029ff60d43699c86d03ced04..5aef630dfa7bf802e1c9a0b70c78dc4d9def236b 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__)