Стоит разделять публичные и приватные исключения. Пользователям не стоит видеть внутреннюю кухню. Так что:
class HttpExcepton extends RuntimeException {}
class ExampleHttpException extends HttpExcepton {}
//
throw new ExampleHttpException('Сообщение не может быть пустым', 422);
Так что всё это дело можно свести к одному единственному try/catch, который будет выводить текст из всех HttpExcepton (и статус код, например, в данном примере 422), и выводить сообщения "Internal Server Error" от любых других.