Лучше всего обрабатывать исключения везде, где они встречаются. Если я сосредоточусь на вопросе в потоке, он должен обрабатываться в обоих случаях, т.е. в контроллере и службах, а также в других местах, где есть вероятность исключения.
Для точки зрения контроллера я бы предложил использовать глобальную обработку исключений с ControllerAdvice , даже если кто-то использует controlleradvice, он также должен обрабатывать исключения в service, utils, handlers и других классах.
Ссылки: https://dzone.com/articles/global-exception-handling-with-controlleradvice