BotchO { throw ‘c’: } }: int m
Автор admin Воскресенье, 3 мая 2009 11:32
BotchO { throw ‘c’: } }: int mainO { try { Botch b: b.f(): } catch(…) { cout « “inside catch(…)” « endl: } } ///.- Определение old_terminate на первый взгляд выглядит несколько странно: мы не только создаем указатель на функцию, но и инициализируем его возвращаемым значением set_terminate(). Хотя после указателя на функцию обычно следует точка с запятой, в действительности это самая обычная переменная, которая может инициализироваться при определении. Класс Botch запускает исключение не только в f(), но и в деструкторе. Как нетрудно убедиться, это приводит к вызову terminate(). Хотя в обработчике 36 Глава 1 • Обработка исключений используется секция catch(…), которая вроде бы должна перехватить все исключения, не оставляя повода для вызова terminate(), функция terminate() все равно будет вызвана. В процессе уничтожения объектов в стеке при обработке первого исключения вызывается деструктор Botch, который генерирует второе исключение и становится причиной вызова terminateQ. Следовательно, деструктор, который сам запускает исключения или приводит к их запуску, обычно является признаком плохого про
Комментарии закрыты.
Последние комментарии