|
Программирование >> Структурное программирование
Резюме Терминология Типичные ошибки программирования Хороший стиль программирования Советы по повышению эффективности Замечания по мобильности Замечания по технике программирования Упражнения для самопроверки Ответы на упражнения для самопроверки Упражнения 13.1. Введение в этой главе мы представляем одно из последних добавлений в язык С++, а именно, обработку исключительных ситуаций или, короче, исключений. Расширяемость С++ может приводить к увеличению количества и видов возможных ошибок. Каждый новый класс добавляет свои собственные возможные ошибки. Возможности языка, описываемые ниже, позволяют программистам писать более ясные, более живучие (робастные), более отказоустойчивые программы. Современные системы (такие, как операционная система Microsoft Windows NT), разрабатываемые с учетом этих и им подобных методов, приносят положительные результаты. Мы также укажем случаи, когда обработка исключений не должна использоваться. План 13.1. Введение 13.2. Когда должна использоваться обработка исключений 13.3 Другие методы обработки ошибок 13.4. Основы обработки исключений в С++ 13.5. Простой пример обработки исключений: деление на нуль 13.6. Блоки try 13.7. Генерация исключений 13.8. Перехват исключений 13.9. Повторная генерация исключений 13.10. Создание условного выражения 13.11. Спецификация исключений 13.12. Обработка непредусмотренных исключений 13.13. Конструкторы, деструкторы и обработка исключений 13.14. Исключения и наследование Стиль и детали обработки исключений, представленные в этой главе, основаны на работе Эндрю Кенига (Andrew Koenig) и Бьерна Страуструпа (Bjarne Stroustrup), изложеной в их статье Exception Handling for С++ (revised)*, изданной в трудах Конференции Proceedings of the USENIX С++ Conference, проведенной в Сан-Франциско в апреле 1990 года. Их работа формулирует основы, которые, вероятно, станут вариантом стандарта ANSI по обработке исключений. Обработка ошибок изменяется качественно и количественно в зависимости от того, предназначена ли данная прикладная программа для распространения, или нет. Изделия, предназначенные для распространения, как правило, предусматривают более тщательную обработку ошибок, чем временный программный продукт. Существует много популярных способов борьбы с ошибками. Часто обработка ошибок распределяется по всему тексту программы. С ошибками работают в тех местах программы, где они могут появляться. Преимущество этого подхода в том, что программист, читающий текст программы, может видеть обработку ошибки в непосредственной близости от соответствующих операторов и определить, была ли осуществлена соответствующая проверка ошибки. Проблема такого подхода состоит в том, что основной код в этом случае загрязняется обработкой ошибок. Для программиста, работающего с прикладной программой, становится труднее читать этот код и определять, правильно ли он функционирует. Это делает код более трудным для восприятия и поддержки. Вот некоторые распространенные примеры исключений: нехватка памяти, выход индекса за пределы массива, арифметическое переполнение, деление на нуль, недопустимые параметры функций. Новые возможности С++ по обработке исключений позволяют программисту вынести операторы обработки ошибок из основной линии выполнения программы. Это облегчает чтение программы и внесение в нее изменений. Выделение кода обработки ошибок из основной линии программы не противоречит достоинствам блочного построения, которые мы обсудили в контексте как структурного, так и объектно-ориентированного программирования. Другое преимущество нового стиля обработки исключений заключается в том, что становится возможным перехватывать или все виды исключений, или только исключения некоторого определенного типа, или исключения взаимосвязанных типов. Это делает программы более устойчивыми к ошибкам, уменьшая вероятность того, что какие-то ошибки не будут перехвачены программой. Обработка исключений осуществляется для того, чтобы дать возможность программе перехватить и обработать ошибку прежде, чем ошибка произойдет и наступят ее неприятные последствия. Если программист не обеспечивает средства обработки неисправимой ошибки, то при ее возникновении программа прекращает свою работу. Обработка исключений создана для работы с так называемыми синхронными ошибками типа попытки деления на нуль (ошибка возникает, когда программа выполняет команду деления). При обработке исключений программа прежде, чем выполнить деление, проверяет знаменатель и генерирует (возбуждает или выбрасывает , как говорят иногда в описаниях С++) исключение, если знаменатель равен нулю. Обработка исключений не предназначена для работы с асинхронными ситуациями типа завершения операции ввода-вывода с диска, поступления сообш;ений от локальной сети, щелчка мыши и т.п.; эти ситуации лучше обрабатываются другими средствами, такими, как обработка прерываний. Обработка исключений используется в случаях, при которых система может быть восстановлена для нормальной работы после ошибки, вызвавшей исключение. Процедура восстановления называется обработчиком исключения. Обработка исключений обычно используется в случаях, при которых ошибка обрабатывается в другой части программы (то есть в другой области действия), чем та, в которой эта ошибка обнаружена. Например, программа, которая ведет интерактивный диалог с пользователем, не должна сама использовать исключения для обработки ошибок ввода. Хороший стиль программирования 13.1 Используйте исключения для ошибок, которые должны бьпь обработаны в другой области действия, отличной от той, где они происходят. Используйте другие средства для обработки ошибок в той области действия, в которой они происходят. Хороший стиль программирования 13.2 Избегайте использовать обработку исключений для целей, отличных от обработки ошибок, потому что это может уменьшить ясность программы. Существует еще одна причина избегать использования методики обработки исключений для обычного программного управления. Механизм исключений создан для обработки ошибок, которые проявляются редко, и используется чаще всего в тех случаях, когда программа должна завершиться. Поэтому совершенно не обязательно, чтобы создатели трансляторов С-Ы- при реализации обработки исключений заботились о достижении оптимальной эффективности, которую можно было бы ожидать при обычном выполнении программы. Совет по повышению эффективности 13.1 Хотя и можно использовать обработку исключений для целей, отличных от обработки ошибок, но это может уменьшать эффективность программы. Совет по повышению эффективности 13.2 Обработка исключений в общем случае выполнена в трансляторах таким образом, что когда исключение не возникает, присутствие кода обработки исключений не вносит никаких дополнительных издержек (или они очень невелики). Когда же исключения возникают, они влекут за собой накладные расходы во время выполнения. Замечание по технике программирования 13.1 Поток управления со стандартными управляющими структурами вообще более ясен и более эффективен, чем применение исключений.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |