Skip to content

Commit 3c2a541

Browse files
committed
Fix suppressed exceptions in Promises.try*
1 parent 7d45369 commit 3c2a541

File tree

1 file changed

+32
-39
lines changed

1 file changed

+32
-39
lines changed

src/main/java/net/tascalate/concurrent/Promises.java

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,20 @@ public static <T, R extends AsyncCloseable> Promise<T> tryApplyEx(Promise<R> p,
156156
T result;
157157
try {
158158
result = fn.apply(resource);
159-
} catch (Throwable actionException) {
159+
} catch (Throwable onAction) {
160160
try {
161-
// Use dependent here?
162-
return resource.close().thenCompose(__ -> failure(actionException));
161+
// Don't use dependent here
162+
// So resource.close() is never cancellable
163+
return resource.close().thenCompose(__ -> failure(onAction));
163164
} catch (Throwable onClose) {
164-
actionException.addSuppressed(onClose);
165+
onClose.addSuppressed(onAction);
165166
return failure(onClose);
166167
}
167168
}
168169

169170
try {
170-
// Use dependent here?
171+
// Don't use dependent here
172+
// So resource.close() is never cancellable
171173
return resource.close().thenApply(__ -> result);
172174
} catch (Throwable onClose) {
173175
return failure(onClose);
@@ -186,31 +188,27 @@ public static <T, R extends AutoCloseable> Promise<T> tryCompose(Promise<R> p,
186188
CompletionStage<T> action;
187189
try {
188190
action = fn.apply(resource);
189-
} catch (Throwable composeException) {
191+
} catch (Throwable onAction) {
190192
try {
191193
resource.close();
194+
return failure(onAction);
192195
} catch (Exception onClose) {
193-
composeException.addSuppressed(onClose);
196+
onClose.addSuppressed(onAction);
197+
return failure(onClose);
194198
}
195-
return failure(composeException);
196199
}
197200

198201
CompletableFutureWrapper<T> result = new CompletableFutureWrapper<>();
199202
action.whenComplete((actionResult, actionException) -> {
200203
try {
201204
resource.close();
205+
result.complete(actionResult, actionException);
202206
} catch (Throwable onClose) {
203207
if (null != actionException) {
204-
actionException.addSuppressed(onClose);
205-
result.failure(actionException);
206-
} else {
207-
result.failure(onClose);
208+
onClose.addSuppressed(actionException);
208209
}
209-
// DONE WITH ERROR ON CLOSE
210-
return;
210+
result.failure(onClose);
211211
}
212-
// CLOSE OK
213-
result.complete(actionResult, actionException);
214212
});
215213
return result.onCancel(() -> cancelPromise(action, true));
216214
});
@@ -227,42 +225,37 @@ public static <T, R extends AsyncCloseable> Promise<T> tryComposeEx(Promise<R> p
227225
CompletionStage<T> action;
228226
try {
229227
action = fn.apply(resource);
230-
} catch (Throwable composeException) {
228+
} catch (Throwable onAction) {
231229
try {
232-
// Use dependent here?
233-
return resource.close().thenCompose(__ -> failure(composeException));
230+
// Don't use dependent here
231+
// So resource.close() is never cancellable
232+
return resource.close().thenCompose(__ -> failure(onAction));
234233
} catch (Throwable onClose) {
235-
composeException.addSuppressed(onClose);
234+
onClose.addSuppressed(onAction);
236235
return failure(onClose);
237236
}
238237
}
239238

240239
CompletableFutureWrapper<T> result = new CompletableFutureWrapper<>();
241240
action.whenComplete((actionResult, actionException) -> {
242-
CompletionStage<?> afterClose;
243241
try {
244-
afterClose = resource.close();
242+
CompletionStage<?> afterClose = resource.close();
243+
afterClose.whenComplete((__, onClose) -> {
244+
if (null == onClose) {
245+
result.complete(actionResult, actionException);
246+
} else {
247+
if (null != actionException) {
248+
onClose.addSuppressed(actionException);
249+
}
250+
result.failure(onClose);
251+
}
252+
});
245253
} catch (Throwable onClose) {
246254
if (null != actionException) {
247-
actionException.addSuppressed(onClose);
248-
result.failure(actionException);
249-
} else {
250-
result.failure(onClose);
255+
onClose.addSuppressed(actionException);
251256
}
252-
// DONE WITH ERROR ON ASYNC CLOSE
253-
return;
257+
result.failure(onClose);
254258
}
255-
// ASYNC CLOSE INVOKE OK
256-
afterClose.whenComplete((__, onClose) -> {
257-
if (null != actionException) {
258-
if (null != onClose) {
259-
actionException.addSuppressed(onClose);
260-
}
261-
result.failure(actionException);
262-
} else {
263-
result.complete(actionResult, onClose);
264-
}
265-
});
266259
});
267260
return result.onCancel(() -> cancelPromise(action, true));
268261
});

0 commit comments

Comments
 (0)