|
Программирование >> Структурное программирование
Типичная ошибка программирования 13.1 Причина, по которой исключения могут быть опасными как альтернатива нормальному потоку управления, заключается в том, что стек может не разматываться и ресурсы, распределенные до возникновения исключения, могут не освобождаться. Этой проблемы можно избежать тщательным программированием. Обработка исключений улучшает отказоустойчивость программы. Становится более приятным писать обработку ошибок, так что программисты чаш;е делают это. Становится также возможным перехватывать исключения самыми различными путями, например, по типу, или даже определять, что должны быть перехвачены исключения любых типов. Обработка исключений обеспечивает программиста богатым дисциплинирующим набором возможностей обработки ошибок. Важно обратить внимание на то, что огромное большинство программ, написанных сегодня, поддерживает только одну линию выполнения задачи. Однако в современных операционных системах, таких, как Windows NT, OS/2 и различные версии UNIX, уделяется все большее внимание многопоточному выполнению задач. Методы, обсуждаемые в этой главе, применяются также для многопоточных программ, хотя мы и не обсуждаем такие программы специально. Замечание по мобильности 13.1 Как уже было сказано, стандарт ANSI для C-i-i- еще не завершен и возможно, что особенности работы с исключениями, описанные в этой главе, могут еще развиваться далее в течение следующих нескольких лет. Когда мы завершали написание этой книги, главные продавцы трансляторов C-i-i- начали поставлять версии с обработкой исключений. Опыт, полученный при работе с ними в течение нескольких следующих лет, должен помочь в продвижении к стандарту. Мы покажем, как обращаться с неперехваченными исключениями. Мы рассмотрим также, как обрабатываются непредусмотренные исключения. Мы покажем, как взаимосвязанные исключения могут быть представлены классами исключений, полученными из общего базового класса исключений. Новые возможности обработки исключений в С++, вероятно, будут широко использоваться в результате усилий по стандартизации С++ со стороны ANSI. Такая стандартизация особенно важна в больших проектах по созданию программного обеспечения, в которых десятки или даже сотни людей работают над проектированием отдельных компонентов системы и эти компоненты должны быть эффективно объединены в единую полную систему и при этом правильно функционировать. Замечание по технике программирования 13.2 Обработка исключений особенно полезна для систем с отдельно разработанными компонентами. Это типично для больших программных комплексов. Обработка исключений позволяет проще объединять компоненты. Каждый компонент может сам осуществлять обнаружение исключительной ситуации отдельно от ее обработки. Обработка исключений может рассматриваться как еще один способ возврата управления из функции или выхода из блока. Как правило, когда генерируется исключение, оно будет обработано источником вызова данной функции, сгенерировавшей это исключение, источником вызова этого вызова и так далее, как бы далеко назад ни надо было пройти по цепочке обращений, чтобы найти обработчик этого исключения. 13.2. Когда должна использоваться обработка исключений Обработка исключений должна использоваться: чтобы обрабатывать только исключительные ситуации, несмотря на то, что ничто не мешает программисту использовать исключения как альтернативу программного управления. чтобы обрабатывать исключения, возникающие в тех компонентах программы, которые сами не имеют механизма обработки этих исключений. чтобы обрабатывать исключения, возникающие в таких компонентах программы, как функции, библиотеки и классы, которые широко используются и в которых не имеет смысла вводить собственную обработку исключений. в больших проектах, чтобы обрабатывать одинаковым способом ошибки, возникающие в различных местах проекта. Хороший стиль программирования 13.3 Используйте обычные методы обработки ошибок (а не обработку исключений) для построения непосредственного, локального обработчика ошибок, в котором программе легче управляться со своими собственными ошибками. Замечание по технике программирования 13.3 Когда идет работа с библиотеками, источник вызова библиотечной функции будет, вероятно, использовать свой уникальный обработчик исключения, сгенерированного библиотечной функции. Маловероятно, чтобы библиотечная функция выполняла такую обработку ошибки, которая удовлетворила бы конкретные потребности всех пользователей. Следовательно, исключения - удобный способ работы с ошибками, возникающими в библиотечных функциях. 13.3. Другие методы обработки ошибок Мы уже рассматривали ранее ряд вариантов работы в исключительных ситуациях: Использование утилиты assert для проверки ошибок разработки. Если проверяемое этой утилитой утверждение неправильно, программа завершается и данный фрагмент программы должен быть исправлен программистом. Это полезно во время отладки. Простое игнорирование исключений. Это недопустимо в программах, предназначенных для широкого распространения, а также в целевом 13.4. Основы обработки исключений в С++ в этом разделе мы кратко рассмотрим основы программирования обработки исключений, в последующих разделах мы исследуем обработку исключений более детально. Обработка исключений в С++ подключается в ситуации, в которой функция обнаруживает ошибку, но не способна сама с ней управиться. Такая функция генерирует исключение (или, как иногда говорят, возбуждает или программном обеспечении, необходимом для работы в критических ситуациях. Но для вашего собственного программного обеспечения, создаваемого для каких-то ваших частных задач совершенно нормально игнорировать многие виды ошибок. Прерывание программы. Это не дает возможность программе закончиться нормально и при этом выдать неправильные результаты. Фактически, для многих типов ошибок прерывание - хорошая стратегия, особенно для исправимых ошибок, которые дают возможность программе доработать до конца и вводят в заблуждение программиста, счита-юш;его, что программа функционировала правильно. Однако, такая стратегия тоже не подходит для ответственных приложений. Здесь также важны проблемы ресурсов. Если программа получила некоторые ресурсы, она, как правило, должна возвратить их до своего завершения. Типичная ошибка программирования 13.2 Прерывание выполнения программы может оставить ресурс в таком состоянии, в котором другие программы не могут его использовать, и мы получаем так называемую утечку ресурса . Установка некоторого индикатора ошибки типа еггпо. Однако проблема в том, что программа может не проверять эти индикаторы ошибки во всех тех точках, в которых эти ошибки могут возникать. Проверка условия ошибки, выдача сообщения об ошибке и вызов exit для передачи соответствующего кода ошибки среде выполнения программы. setjump и longjump. Эти возможности, доступные через <setjump.h>, позволяют программисту, минуя глубоко вложенные вызовы функций, задать непосредственный переход к обработчику ошибки. Без set-jump/longjump программа должна выполнить несколько возвратов, чтобы выйти из глубоко вложенных вызовов функций, setjump и longjump могут, конечно, использоваться для перехода к обработчику ошибки. Но они опасны в С-Н-, поскольку они разматывают стек без вызовов деструкторов автоматических объектов. Это может вести к ряду серьезных проблем. Выделение некоторых специфических видов ошибок для их обработки. Например, когда операция new дает сбой при выделении памяти, она может заставить выполняться функцию new handler для обработки этой ошибки. Эту функцию можно менять, передавая имя функции в качестве аргумента set new handler.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |