             nextCtx.prev = prevCtx
         }
 
-        do {
-            try context.invokeHandlerRemoved()
-            promise?.succeed(())
-        } catch let err {
-            promise?.fail(err)
-        }
+        context.invokeHandlerRemoved()
+        promise?.succeed(())
 
         // We need to keep the current node alive until after the callout in case the user uses the context.
         context.next = nil

        }
    }

    fileprivate func invokeHandlerAdded() throws {
        self.eventLoop.assertInEventLoop()

        handler.handlerAdded(context: self)
    }

    fileprivate func invokeHandlerRemoved() throws {
        self.eventLoop.assertInEventLoop()
        guard !self.removeHandlerInvoked else {
            return

        let context = ChannelHandlerContext(name: name ?? nextName(), handler: handler, pipeline: self)
        operation(context, relativeContext)

        context.invokeHandlerAdded()
        return .success(())
    }

    /// Synchronously add a single new `ChannelHandlerContext` after one that currently exists in the
