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