Мне нравится этот подход по нескольким причинам.
Во-первых, он безопасно завершается неудачей.Если кто-то не откровенно выбрасывает ClientException, то подробности исключения не сообщаются.Забвение отображения чего-либо - это меньшая проблема, чем случайное отображение чего-либо.
Во-вторых, оно позволяет принять решение о том, отображать ли исключение в нужном месте.Например, отображаются не все исключения IOException.Некоторые могут быть, а другие не будут.Конкретные исключения могут быть обнаружены и преобразованы в любом месте стека вызовов, так что преобразование может быть выполнено в месте, где, как известно, оно является правильным.
Обе эти вещи вместе означают, что будущий разработчик не будет ненадлежащим образомизмените весь класс исключений для отображения или подумайте, что что-то не будет отображаться, когда это будет на самом деле.
Кроме того, цель использования определенного типа исключения состоит в том, чтобы позже определить, какое действие предпринятьв ответ на это исключение.«Показывать это сообщение пользователю» - это очень хорошее действие для указания.Как только это решение будет принято, точная природа исключения совершенно не имеет значения.(Исходная проблема может быть помещена в свойство InnerException, для целей ведения журнала, конечно.)
Так что, на мой взгляд, это хороший дизайн.