         let context = ChannelHandlerContext(name: name ?? nextName(), handler: handler, pipeline: self)
         operation(context, relativeContext)
 
-        do {
-            try context.invokeHandlerAdded()
-            return .success(())
-        } catch let err {
-            removeHandlerFromPipeline(context: context, promise: nil)
-            return .failure(err)
-        }
+        context.invokeHandlerAdded()
+        return .success(())
     }
 
     /// Synchronously add a single new `ChannelHandlerContext` after one that currently exists in the

        }
    }

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

        handler.handlerAdded(context: self)
    }

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

            nextCtx.prev = prevCtx
        }

        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
