мы для старого легаси проекта, запилили свой operations-фреймворк, все контроллеры/экшены/MQ конзюмеры растащили по операциям, в каждой операции напилили контекстно-зависимых обработчиков исключений, вернули резалт-обжекты, которые уже на уровне контроллеров превращались в ошибки с локализацией, статус коды и пр., что необходимо на транспортном уровне. Это конечно скучная работа, но выполнимая.
значит все таки нужно пилить обрааботку на уровне контроллеров(готовить сборку результата) но как правильней это все чудо пробросить без пилений как у тебя цепочек пробросов на самый верх, может кто то уже такое писал, я искал на гите не нашел нужное мне, только дефолтовые 4хх-5хх покрывают