code: @Override
      public boolean handle(Exception e, @Nonnull Run<?, ?> run, @Nonnull TaskListener listener) {
          LOG.debug("Exception in {} will be processed with {} handlers",
                  run.getParent().getName(), handlers.size(), e);
          try {
              for (ErrorHandler next : handlers) {
                  if (next.handle(e, run, listener)) {
                      LOG.debug("Exception in {} [{}] handled by [{}]",
                              run.getParent().getName(),
                              e.getMessage(),
                              next.getClass());
                      return true;
                  }
              }
          } catch (Exception unhandled) {
              LOG.error("Exception in {} unhandled", run.getParent().getName(), unhandled);
              throw new ErrorHandlingException(unhandled);
          }
  
          throw new ErrorHandlingException(e);
      }
docs: Handles exception with help of other handlers. If no one will handle it, it will be thrown to the top level
  
  @param e        exception to handle (log, ignore, process, rethrow)
  @param run      run object from the step
  @param listener listener object from the step
  
  @return true if exception handled or rethrows it