Это может зависеть от того, где и как вы хотите обработать исключение. Клиент (независимо от платформы) всегда получит исключение ошибки мыла, независимо от того, допускает ли код службы необработанные исключения, служба явно вызывает FaultException или генерирует общую версию FaultException.
Если вы хотите определить пользовательские исключения ошибок, чтобы упростить идентификацию конкретных условий эксплуатации, это вопрос проектирования. Мое эмпирическое правило заключается в том, чтобы генерировать пользовательские ошибки, только когда я ожидаю, что клиент выполнит альтернативную логику, вызванную этой пользовательской ошибкой. Что-то вроде валидации - это серая область, потому что вы действительно не хотите, чтобы вся ваша детальная логика валидации определялась пользовательскими ошибками. Я обычно создаю одну ошибку сбоя пользовательской проверки и включаю в нее все проблемы проверки, которые он может найти в качестве свойства списка пользовательской ошибки.
Обработка исключений всегда является дорогостоящим процессом, но нет реальной разницы в производительности между созданием FaultException или любого другого исключения .NET на стороне службы.