code: @Override
    public void close() throws IOException {
      Throwable throwable = thrown;
  
      // close closeables in LIFO order
      while (!stack.isEmpty()) {
        Closeable closeable = stack.removeFirst();
        try {
          closeable.close();
        } catch (Throwable e) {
          if (throwable == null) {
            throwable = e;
          } else {
            suppressor.suppress(closeable, throwable, e);
          }
        }
      }
  
      if (thrown == null && throwable != null) {
        Throwables.propagateIfPossible(throwable, IOException.class);
        throw new AssertionError(throwable); // not possible
      }
    }
docs: Closes all {@code Closeable} instances that have been added to this {@code Closer}. If an
  exception was thrown in the try block and passed to one of the {@code exceptionThrown} methods,
  any exceptions thrown when attempting to close a closeable will be suppressed. Otherwise, the
  <i>first</i> exception to be thrown from an attempt to close a closeable will be thrown and any
  additional exceptions that are thrown after that will be suppressed.