diff --git a/include/sdbusplus/async/context.hpp b/include/sdbusplus/async/context.hpp
index 9101df3..96cb38d 100644
--- a/include/sdbusplus/async/context.hpp
+++ b/include/sdbusplus/async/context.hpp
@@ -6,7 +6,6 @@
 #include <sdbusplus/event.hpp>
 
 #include <condition_variable>
-#include <deque>
 #include <mutex>
 #include <stop_token>
 #include <thread>
@@ -108,7 +107,6 @@
     std::mutex lock{};
     std::condition_variable caller_wait{};
 
-    std::deque<std::exception_ptr> pending_exceptions = {};
     bool spawn_watcher_running = false;
 
     /** Completion object to signal the worker that 'sd_bus_wait' is done. */
@@ -117,12 +115,11 @@
     bool wait_process_stopped = false;
 
     void worker_run();
-    void spawn_complete(std::exception_ptr&& = {});
+    void spawn_complete();
     void check_stop_requested();
     void spawn_watcher();
 
     void caller_run();
-    void rethrow_pending_exception();
     void wait_for_wait_process_stopped();
 
     static int dbus_event_handle(sd_event_source*, int, uint32_t, void*);
diff --git a/src/async/context.cpp b/src/async/context.cpp
index 85e0200..c8f7e5f 100644
--- a/src/async/context.cpp
+++ b/src/async/context.cpp
@@ -137,10 +137,7 @@
     // Run the primary portion of the run-loop.
     caller_run();
 
-    // Rethrow the pending exception (if it exists).
-    rethrow_pending_exception();
-
-    // Otherwise this should be final_stop...
+    // This should be final_stop...
 
     // We need to wait for the pending wait process and stop it.
     wait_for_wait_process_stopped();
@@ -155,9 +152,6 @@
     {
         worker_thread.join();
     }
-
-    // Check for one last exception.
-    rethrow_pending_exception();
 }
 
 void context::worker_run()
@@ -169,16 +163,11 @@
     loop.run();
 }
 
-void context::spawn_complete(std::exception_ptr&& e)
+void context::spawn_complete()
 {
     {
         std::lock_guard l{lock};
         spawn_watcher_running = false;
-
-        if (e)
-        {
-            pending_exceptions.emplace_back(std::move(e));
-        }
     }
 
     if (stop_requested())
@@ -222,7 +211,7 @@
     // we get an exception.
     auto keep_running = [this]() {
         std::lock_guard l{lock};
-        return !final_stop.stop_requested() && pending_exceptions.empty();
+        return !final_stop.stop_requested();
     };
 
     // If we are suppose to keep running, start the run loop.
@@ -235,8 +224,8 @@
         }
         else
         {
-            // We've already been running and there might an exception or
-            // completion pending.  Spawn a new watcher that checks for these.
+            // We've already been running and there might a completion pending.
+            // Spawn a new watcher that checks for these.
             spawn_watcher();
         }
 
@@ -248,7 +237,8 @@
     }
     else
     {
-        // There might be pending exceptions still, so spawn a watcher for them.
+        // There might be pending completions still, so spawn a watcher for
+        // them.
         spawn_watcher();
     }
 }
@@ -277,19 +267,6 @@
     }
 }
 
-void context::rethrow_pending_exception()
-{
-    {
-        std::lock_guard l{lock};
-        if (!pending_exceptions.empty())
-        {
-            auto e = pending_exceptions.front();
-            pending_exceptions.pop_front();
-            std::rethrow_exception(std::move(e));
-        }
-    }
-}
-
 void details::wait_process_completion::arm() noexcept
 {
     // Call process.  True indicates something was handled and we do not
@@ -336,8 +313,7 @@
         // don't have the required parameters).
         ctx.caller_wait.wait(lock, [&] {
             return (ctx.pending != nullptr) || (ctx.staged != nullptr) ||
-                   ctx.final_stop.stop_requested() ||
-                   !ctx.pending_exceptions.empty();
+                   ctx.final_stop.stop_requested();
         });
 
         // Save the waiter as pending.
