Close resources in reverse order safely
Java
import java.util.ArrayList;
import java.util.List;
/** Collects closeable resources and closes them in reverse order. */
public final class ResourceScope implements AutoCloseable {
private final List<AutoCloseable> resources = new ArrayList<>();
private final List<Exception> failures = new ArrayList<>();
public <T extends AutoCloseable> T add(T resource) {
resources.add(resource);
return resource;
}
@Override
public void close() throws Exception {
// Reverse order mirrors nested try-with-resources and dependency order.
for (int i = resources.size() - 1; i >= 0; i--) {
try {
resources.get(i).close();
} catch (Exception e) {
failures.add(e);
}
}
if (!failures.isEmpty()) {
Exception first = failures.get(0);
for (Exception extra : failures.subList(1, failures.size())) {
first.addSuppressed(extra);
}
throw first;
}
}
}