Issue
The Handling SuspendExecutionException section correctly explains that SuspendExecutionException extends Error, bypasses a normal catch (Exception e), and must never be swallowed.
It does not currently explain the related finally behavior: Java executes an active finally block while SuspendExecutionException unwinds the stack. As a result, resource cleanup placed in finally can run during a normal durable suspension rather than only when the overall durable execution succeeds or fails.
This applies to any operation that can suspend, including wait, waitForCondition, callbacks, invokes, retry delays, and suspension inside map or parallel branches.
For example, this pattern can terminate a resource immediately when the wait suspends:
try {
var resource = ctx.step("launch-resource", Resource.class,
stepCtx -> launchResource());
var result = ctx.waitForCallback("work-complete", Result.class,
(callbackId, stepCtx) -> dispatchWork(resource, callbackId));
return result;
} finally {
ctx.step("terminate-resource", Void.class,
stepCtx -> terminateResource());
}
Page/Location
https://github.com/aws/aws-durable-execution-sdk-java/blob/main/docs/advanced/error-handling.md
Section: Handling SuspendExecutionException
Suggested Fix
Extend the section with guidance that:
finally executes when the internal suspension signal unwinds the handler stack.
- Durable cleanup that must happen only on completion or actual failure should not be placed in
finally around suspending operations.
- Cleanup should run explicitly after successful completion and from handlers for application or operation exceptions.
SuspendExecutionException must continue to propagate untouched; avoid catch (Throwable) unless it immediately rethrows suspension and other control-flow errors appropriately.
Include a safe Java example such as:
try {
var result = performDurableWorkThatMaySuspend(ctx);
ctx.step("cleanup-resource", Void.class,
stepCtx -> cleanupResource());
return result;
} catch (Exception e) {
ctx.step("cleanup-resource", Void.class,
stepCtx -> cleanupResource());
throw e;
}
The cleanup step occupies the same next durable-operation position on either terminal path, while SuspendExecutionException bypasses catch (Exception e) and suspends normally.
This is the Java-specific companion to the shared documentation request: aws/aws-durable-execution-docs#131.
Issue
The
Handling SuspendExecutionExceptionsection correctly explains thatSuspendExecutionExceptionextendsError, bypasses a normalcatch (Exception e), and must never be swallowed.It does not currently explain the related
finallybehavior: Java executes an activefinallyblock whileSuspendExecutionExceptionunwinds the stack. As a result, resource cleanup placed infinallycan run during a normal durable suspension rather than only when the overall durable execution succeeds or fails.This applies to any operation that can suspend, including
wait,waitForCondition, callbacks, invokes, retry delays, and suspension inside map or parallel branches.For example, this pattern can terminate a resource immediately when the wait suspends:
Page/Location
https://github.com/aws/aws-durable-execution-sdk-java/blob/main/docs/advanced/error-handling.md
Section:
Handling SuspendExecutionExceptionSuggested Fix
Extend the section with guidance that:
finallyexecutes when the internal suspension signal unwinds the handler stack.finallyaround suspending operations.SuspendExecutionExceptionmust continue to propagate untouched; avoidcatch (Throwable)unless it immediately rethrows suspension and other control-flow errors appropriately.Include a safe Java example such as:
The cleanup step occupies the same next durable-operation position on either terminal path, while
SuspendExecutionExceptionbypassescatch (Exception e)and suspends normally.This is the Java-specific companion to the shared documentation request: aws/aws-durable-execution-docs#131.