Według mnie samo użycie switcha jest spoko, jednak miałbym uwagę do klas wyjątków. Mianowicie najlepszą praktyką jest dostarczanie dedykowanego wyjątku dla każdego use case'a, tj.:
throw UserException::notFound();
throw UserException::invalidCredentials();
// lub
throw new UserNotFoundException();
throw new InvalidUserCredentialsException();
W ten sposób nie musisz ustawiać komunikatu, ponieważ każdy wyjątek ma taki komunikat predefiniowany.
Btw po instrukcji throw nie musisz robić break :)