На мой взгляд, основной мотивацией для пользовательских исключений является достижение лучшего моделирования предметной области вашего приложения. При разработке классов вы тратите много усилий, чтобы назвать объекты и распределить их обязанности. Я думаю, что на данный момент некоторые усилия по рассмотрению возможных условий ошибки - это хорошая инвестиция. Например, при копании глубже клиенты часто могут дать вам несколько общих примеров, которые необходимо обработать (например, неверные данные, нарушение логических ограничений, ненадежные датчики и т. Д.). В результате у вас будет код, который легче понять и изменить. Специфичные для приложения ошибки хорошо разделены, и обработка дополнительных ошибок может быть легко достигнута.
Другой момент заключается в том, что он может обеспечить лучшую абстракцию для разных частей системы. Например, если вы действительно ожидаете, что реализация части персистентности изменится в будущем, тогда гораздо лучше использовать пользовательские исключения в ее API. В противном случае вам будет очень весело работать с SQLException или SAXException в разных местах: -)