Само по себе это не страшно, но нужно действительно наблюдать за вложением.
Допустимый вариант использования:
Я компонент с низким уровнем выхода, который может столкнуться с рядом различных ошибок, однако мой потребитель заинтересован только в исключении определенного типа. Поэтому я могу сделать это:
catch(IOException ex)
{
throw new PlatformException("some additional context", ex);
}
Теперь это позволяет потребителю:
try
{
component.TryThing();
}
catch(PlatformException ex)
{
// handle error
}
Да, я знаю, что некоторые люди скажут, но потребитель должен поймать IOException, но это зависит от того, насколько абстрактным на самом деле является потребляющий код. Что если Impl что-то сохраняет на диск, а у потребителя нет веской причины полагать, что его работа коснется диска? В таком случае не имеет смысла помещать эту обработку исключений в код потребления.
Чего мы обычно пытаемся избежать, используя этот шаблон, так это размещаем обработчик исключений «ловить все» в коде бизнес-логики, потому что мы хотим выяснить все возможные типы исключений, поскольку они могут привести к более фундаментальной проблеме, должен быть исследован.
Если мы не улавливаем, он всплывает, попадает в обработчик уровня «верхний верх» и должен остановить приложение дальше. Это означает, что клиент сообщит об этом исключении, и вы получите возможность его изучить. Это важно, когда вы пытаетесь создать надежное программное обеспечение. Вам необходимо найти все эти случаи ошибок и написать специальный код для их обработки.
Что не очень красиво, так это то, что вы вкладываете их в чрезмерное количество, и именно эту проблему вы должны решить с помощью этого кода.
Как сказал другой автор, исключения относятся к разумно исключительному поведению, но не заходите слишком далеко. В основном код должен выражать «нормальную» операцию, а исключения должны обрабатывать потенциальные проблемы, с которыми вы можете столкнуться.
Что касается исключений производительности, то вы получите ужасные результаты, если проведете тестирование с отладчиком на встроенном устройстве, но в выпуске без отладчика они на самом деле довольно быстрые.
Главное, что люди забывают при обсуждении производительности исключений, это то, что в случаях ошибок все равно все замедляется, потому что пользователь столкнулся с проблемой. Мы действительно заботимся о скорости, когда сеть не работает, и пользователь не может сохранить свою работу? Я очень сомневаюсь, что возвращение отчета об ошибке пользователю на несколько мс быстрее будет иметь значение.
Основное правило, которое следует помнить при обсуждении исключений, состоит в том, что Исключения не должны возникать в рамках нормального потока приложения (обычное значение, без ошибок). Все остальное вытекает из этого заявления.
В конкретном примере, который вы приводите, я не уверен. Мне кажется, что никакой выгоды от обертывания того, что кажется универсальным исключением tcl, в другое обобщенное звучащее исключение tcl не получится. Во всяком случае, я бы предложил отследить первоначального создателя кода и узнать, есть ли какая-то особая логика в его мышлении. Однако есть вероятность, что вы можете просто убить добычу.