@Nonnull
    default Promise<V> exceptionally(@Nonnull ThreadContext context, @Nonnull Function<Throwable, ? extends V> fn) {
        switch (context) {
            case SYNC:
                return exceptionallySync(fn);
            case ASYNC:
                return exceptionallyAsync(fn);
            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. 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
@return the new promise
helper/src/main/java/me/lucko/helper/promise/Promise.java