@Nonnull
    default Promise<V> exceptionallyDelayed(@Nonnull ThreadContext context, @Nonnull Function<Throwable, ? extends V> fn, long delay, @Nonnull TimeUnit unit) {
        switch (context) {
            case SYNC:
                return exceptionallyDelayedSync(fn, delay, unit);
            case ASYNC:
                return exceptionallyDelayedAsync(fn, delay, unit);
            default:
                throw new AssertionError();
        }
    }
Returns a new Promise that, when this promise completes normally, is
executed with this promise's exception as the argument to the given
function, after the delay has elapsed. Otherwise, if this promise
completes normally, then the returned promise also completes normally
with the same value.

@param context the type of executor to use to supply the promise
@param fn the function to use to compute the value of the returned
          Promise, if this promise completed exceptionally
@param delay the delay
@param unit the unit of delay
@return the new promise
helper/src/main/java/me/lucko/helper/promise/Promise.java