I think you could avoid throwing from one method to catch in the other by something like:

```
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
              Object handler) throws Exception {

          Optional<User> user = userFetcher.userFor(request);
          if (!authorised(user, requestUri)) {
          	  writeError(new NotAuthorizedException());
          	  return false;
          } else if (needsProfile(uri) && !hasProfile(user)) {
              writeError(new UserProfileIncompleteException());
              return false;
          }
`