docs: public final Object invokeNextAndHandle(InvocationContext ctx, VisitableCommand command,
                                             InvocationFinallyFunction function) {
        try {
           Object rv;
           Throwable throwable;
           try {
              if (nextDDInterceptor != null) {
                 rv = command.acceptVisitor(ctx, nextDDInterceptor);
              } else {
                 rv = nextInterceptor.visitCommand(ctx, command);
              }
              throwable = null;
  
              if (rv instanceof InvocationStage) {
                 return ((InvocationStage) rv).andHandle(ctx, command, function);
              }
           } catch (Throwable t) {
              rv = null;
              throwable = t;
           }
           return function.apply(ctx, command, rv, throwable);
        } catch (Throwable throwable) {
           return new SimpleAsyncInvocationStage(throwable);
        }
     }