docs: public @CheckForNull V start() throws Exception {
          V result = null;
          int currentAttempt = 0;
          boolean success = false;
  
          while (currentAttempt < attempts && !success) {
              currentAttempt++;
              try {
                  if (LOGGER.isLoggable(Level.INFO)) {
                      LOGGER.log(Level.INFO, Messages.Retrier_Attempt(currentAttempt, action));
                  }
                  result = callable.call();
  
              } catch (Exception e) {
                  if(duringActionExceptions == null || Stream.of(duringActionExceptions).noneMatch(exception -> exception.isAssignableFrom(e.getClass()))) {
                      // if the raised exception is not considered as a controlled exception doing the action, rethrow it
                      LOGGER.log(Level.WARNING, Messages.Retrier_ExceptionThrown(currentAttempt, action), e);
                      throw e;
                  } else {
                      // if the exception is considered as a failed action, notify it to the listener
                      LOGGER.log(Level.INFO, Messages.Retrier_ExceptionFailed(currentAttempt, action), e);
                      if (duringActionExceptionListener != null) {
                          LOGGER.log(Level.INFO, Messages.Retrier_CallingListener(e.getLocalizedMessage(), currentAttempt, action));
                          result = duringActionExceptionListener.apply(currentAttempt, e);
                      }
                  }
              }
  
              // After the call and the call to the listener, which can change the result, test the result
              success = checkResult.test(currentAttempt, result);
              if (!success) {
                  if (currentAttempt < attempts) {
                      LOGGER.log(Level.WARNING, Messages.Retrier_AttemptFailed(currentAttempt, action));
                      LOGGER.log(Level.FINE, Messages.Retrier_Sleeping(delay, action));
                      try {
                          Thread.sleep(delay);
                      } catch (InterruptedException ie) {
                          LOGGER.log(Level.FINE, Messages.Retrier_Interruption(action));
                          Thread.currentThread().interrupt(); // flag this thread as interrupted
                          currentAttempt = attempts; // finish
                      }
                  } else {
                      // Failed to perform the action
                      LOGGER.log(Level.INFO, Messages.Retrier_NoSuccess(action, attempts));
                  }
              } else {
                  LOGGER.log(Level.INFO, Messages.Retrier_Success(action, currentAttempt));
              }
          }
  
          return result;
      }