In this code:
doSomethingThatMightThrowAnException()
.whenComplete((result, ex) -> doSomethingElse()})
.exceptionally(ex -> handleException(ex));
doSomethingThatMightThrowAnException() is chained with .whenComplete((result, ex) -> doSomethingElse()}) and .exceptionally(ex -> handleException(ex)); but if it throws an exception it ends right there as no object will be passed on in the chain.
Remember that an exception will throw out to the caller, so unless doSomethingThatMightThrowAnException() catches the exception internally it will throw out. If this is your class you should know if it does throw, if not check docs for libraries that you use.