|
Программирование >> Разработка устойчивых систем
Не придавайте слишком большого значения различиям между двумя режимами. Помните, что система обработки исключений обычно составляет минимальную часть программы, так что реальные затраты памяти оказываются гораздо меньше (обычно от 5 до 15 %). Лишние операции замедляют работу программы, но умная реализация компилятора решает проблему. Поскольку сведения об обработке исключений и смещениях локальных объектов могут быть вычислены на стадии компиляции, они хранятся не в кадре стека, а в конкретном месте, связанном с каждой функцией. В сущности, вы выводите лишнюю информацию из кадра стека, а следовательно - экономите время на ее занесении в стек. Такое решение называется моделью обработки исключений с нулевыми затратами, а оптимизированное место хранения данных вне стека называется теневъш стеком. Итоги Восстановление работы после возникновения ошибок является одной из основных проблем практически в любой программе. Это восстановление особенно важно в С++ при написании программных компонентов, которые будут использоваться другими программистами. Чтобы система в целом была устойчивой к ошибкам, устойчивым должен быть каждый из ее компонентов. Механизм обработки исключений в С++ позволяет упростить разработку больших надежных программ, содержащих минимально возможный объем вспомогательного кода и снижающих вероятность возникновения необработанных ошибок. Поставленная цель достигается с незначительными потерями эффективности и с незначительным влиянием на работу существующих программ. Освоить элементарную обработку исключений совсем несложно; после освоения начинайте использовать исключения в своих программах как можно раньше. -HasDestructorOO void gO: Функция g может запускать исключения void fO { HasDestructor h: gO: } III:- При включенной обработке исключений компилятор должен хранить в кадре стека f() информацию о доступности ~HasDestructor() во время выполнения программы (чтобы при возникновении исключения в д() можно было правильно уничтожить h). В табл. 1.1 приведены данные по объемам откомпилированных файлов (.obj) в байтах. Таблица 1.1. Размеры откомпилированных файлов в программах с поддержкой и без поддержки исключений Упражнения Напищите три функции. Первая функция возвращает код ошибки, вторая - устанавливает значение errno, а третья - использует вызов signal(). Напищите программу с вызовами этих функций и обработкой ошибок. Затем напищите четвертую функцию, которая запускает исключение, вызовите ее и перехватите исхслючение. Опишите различия между этими четырьмя решениями и объясните преимущества схемы с обработкой исключений. Создайте класс, функции которого запускают исключения. Определите внутри него вложенный класс для использования в качестве объекта исключения. При конструировании класс исключения получает один аргумент const char*, представляющий строку описания. Создайте функцию класса, запускающую это ис1С71ючение (укажите это в спецификации исключений функции). Напищите блок try с вызовом этой функции и секцию catch, которая выводит строку описания. Перепишите класс Stash из главы 13 первого тома так, чтобы оператор [] генерировал исключения out of range. Напишите обобщенную функцию main(), которая бы перехватывала все ис-1С71ючения и сообщала о них, как об ошибках. Создайте класс с собственным оператором new. Оператор должен выделять память для десяти объектов, а на одиннадцатом объекте запускать исключение из-за нехватки памяти . Включите в класс статическую функцию для освобождения этой памяти. Затем напишите функцию main() с блоком try и секцией catch, которая бы вызывала функцию освобождения памяти. Поместите их в цикл while и продемонстрируйте восстановление после исключения с продолжением работы программы. Создайте деструктор, запускающий исключение. Напишите программу, которая бы показывала, что запуск нового исключения до завершения обработки предыдущего приводит к вызову terminate(). Убедитесь в том, что все объекты исключений (запускаемых) должным образом уничтожаются. Создайте объект исключения в куче и запустите указатель на него. Убедитесь в том, что этот объект не будет уничтожаться. Напищите функцию со спецификацией исключений, запускающую исключения типов char, int, bool, а также пользовательского типа. Перехватите все исключения в main() и покажите, что они действительно перехватываются. Определите пользовательский класс исключения производным от стандартного исключения. Напишите функцию таким образом, чтобы программа восстанавливалась после ошибки, и попробуйте выполнить ее снова. Исключения принадлежат к числу тех возможностей, польза от которых весьма существенна. 10. Измените предыдущий пример так, чтобы функция запускала исключение типа double, нарушающее спецификацию исключений. Перехватите нарушение в пользовательском обработчике unexpected(), который выводит сообщение и корректно завершает программу (то есть без вызова abort()). 11. Напишите класс Garage с вложенным классом Саг, содержащим вложенный класс Motor. Используйте блок try уровня функции в конструкторе класса Garage для перехвата исключения из класса Motor при инициализации Саг. Запустите другое исключение из тела обработчика конструктора Garage и перехватите его в main().
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |