diff --git a/launcher/tasks/Task.cpp b/launcher/tasks/Task.cpp
index a54b4e7c..XXXXXXXX 100644
--- a/launcher/tasks/Task.cpp
+++ b/launcher/tasks/Task.cpp
@@ -1,6 +1,7 @@
 #include "Task.h"
 
 #include <QDebug>
+#include <exception>
 
 #include "AssertHelpers.h"
 
@@ -107,5 +107,19 @@ void Task::start()
     // NOTE: only fall through to here in end states
     m_state = State::Running;
     emit started();
-    executeTask();
+    try {
+        executeTask();
+    } catch (const std::exception& e) {
+        qCCritical(taskLogC) << "Task" << describe()
+                             << "threw uncaught std::exception:" << e.what();
+        if (isRunning()) {
+            emitFailed(QString::fromUtf8(e.what()));
+        }
+    } catch (...) {
+        qCCritical(taskLogC) << "Task" << describe()
+                             << "threw uncaught non-std exception";
+        if (isRunning()) {
+            emitFailed(tr("Unhandled internal exception"));
+        }
+    }
 }
