@ Брэд Туттероу
Исключение не теряется в первом случае, оно передается конструктору. В остальном я согласен с вами, но второй подход - очень плохая идея из-за потери трассировки стека. Когда я работал с .NET, я сталкивался со многими случаями, когда другие программисты делали именно это, и это безнадежно расстраивало меня, когда мне нужно было увидеть истинную причину исключения, а только обнаружить, что оно было переброшено из огромного блока try, где Теперь я понятия не имею, откуда возникла проблема.
Я также второй комментарий Брэда, что вы не должны беспокоиться о производительности. Этот вид микрооптимизации - УЖАСНАЯ идея. Если вы не говорите о создании исключения в каждой итерации цикла for, который выполняется в течение длительного времени, вы, скорее всего, не столкнетесь с проблемами производительности из-за использования вашего исключения.
Всегда оптимизируйте производительность, когда у вас есть метрики, которые указывают на то, что вам НЕОБХОДИМО оптимизировать производительность, а затем попадайте в точки, которые оказались виновником.
Намного лучше иметь читаемый код с простыми возможностями отладки (т.е. IE не скрывает трассировку стека), а не заставлять что-то работать на наносекунду быстрее.
Последнее замечание по поводу преобразования исключений в пользовательское исключение ... это может быть очень полезной конструкцией, особенно при работе с пользовательскими интерфейсами. Вы можете обернуть каждый известный и разумный исключительный случай в какое-то базовое пользовательское исключение (или исключение из указанного базового исключения), и тогда пользовательский интерфейс может просто перехватить это базовое исключение. При обнаружении исключения потребуется предоставить средства отображения информации пользователю, например, свойство ReadableMessage или что-то в этом роде. Таким образом, каждый раз, когда пользовательский интерфейс пропускает исключение, это происходит из-за ошибки, которую необходимо исправить, и всякий раз, когда он перехватывает исключение, это известное состояние ошибки, которое может и должно обрабатываться пользовательским интерфейсом должным образом.