diff --git a/src/manager.cpp b/src/manager.cpp
index 3dda290383a75fe6ffeab3dcb47d768391b08ac2..e6561652cf8612af0b1d036bf41fb8b857371d80 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1407,7 +1407,11 @@ void Manager::pollEvents()
             // Think twice before modify this code.
 
             nextEventHandler_ = std::next(iter);
-            iter->second();
+            try {
+                iter->second();
+            } catch (const std::exception& e) {
+                RING_ERR("MainLoop exception (handler): %s", e.what());
+            }
             iter = nextEventHandler_;
         }
     }
@@ -1422,7 +1426,14 @@ void Manager::pollEvents()
                 return;
 
             auto next = std::next(iter);
-            if (not (*iter)())
+            bool result;
+            try {
+                result = (*iter)();
+            } catch (const std::exception& e) {
+                RING_ERR("MainLoop exception (task): %s", e.what());
+                result = false;
+            }
+            if (not result)
                 tmpList.erase(iter);
             iter = next;
         }