docs: public final Object invokeNextAndFinally(InvocationContext ctx, VisitableCommand command,
                                              InvocationFinallyAction action) {
        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).andFinally(ctx, command, action);
              }
           } catch (Throwable t) {
              rv = null;
              throwable = t;
           }
           action.accept(ctx, command, rv, throwable);
           return throwable == null ? rv : new SimpleAsyncInvocationStage(throwable);
        } catch (Throwable t) {
           return new SimpleAsyncInvocationStage(t);
        }
     }