11.3.2. Раскрутка стека
11.3.2. Раскрутка стека
Поиск catch-обработчикадля возбужденного исключения происходит следующим образом. Когда выражение throw находится в try-блоке, все ассоциированные с ним предложения catch исследуются с точки зрения того, могут ли они обработать исключение. Если подходящее предложение catch найдено, то исключение обрабатывается. В противном случае поиск продолжается в вызывающей функции. Предположим, что вызов функции, выполнение которой прекратилось в результате исключения, погружен в try-блок; в такой ситуации исследуются все предложения catch, ассоциированные с этим блоком. Если один из них может обработать исключение, то процесс заканчивается. В противном случае переходим к следующей по порядку вызывающей функции. Этот поиск последовательно проводится во всей цепочке вложенных вызовов. Как только будет найдено подходящее предложение, управление передается в соответствующий обработчик.
В нашем примере первая функция, для которой нужен catch-обработчик, – это функция-член pop() класса iStack. Поскольку выражение throw внутри pop() не находится в try-блоке, то программа покидает pop(), не обработав исключение. Следующей рассматривается функция, вызвавшая pop(), то есть main(). Вызов pop() внутри main() находится в try-блоке, и далее исследуется, может ли хотя бы одно ассоциированное с ним предложение catch обработать исключение. Поскольку обработчик исключения popOnEmpty имеется, то управление попадает в него.
Процесс, в результате которого программа последовательно покидает составные инструкции и определения функций в поисках предложения catch, способного обработать возникшее исключение, называется раскруткой стека. По мере раскрутки прекращают существование локальные объекты, объявленные в составных инструкциях и определениях функций, из которых произошел выход. C++ гарантирует, что во время описанного процесса вызываются деструкторы локальных объектов классов, хотя они исчезают из-за возбужденного исключения. (Подробнее мы поговорим об этом в главе 19.)
Если в программе нет предложения catch, способного обработать исключение, оно остается необработанным. Но исключение – это настолько серьезная ошибка, что программа не может продолжать выполнение. Поэтому, если обработчик не найден, вызывается функция terminate() из стандартной библиотеки C++. По умолчанию terminate() активизирует функцию abort(), которая аномально завершает программу. (В большинстве ситуаций вызов abort() оказывается вполне приемлемым решением. Однако иногда необходимо переопределить действия, выполняемые функцией terminate(). Как это сделать, рассказывается в книге [STROUSTRUP97].)
Вы уже, наверное, заметили, что обработка исключений и вызов функции во многом похожи. Выражение throw ведет себя аналогично вызову, а предложение catch чем-то напоминает определение функции. Основная разница между этими двумя механизмами заключается в том, что информация, необходимая для вызова функции, доступна во время компиляции, а для обработки исключений – нет. Обработка исключений в C++ требует языковой поддержки во время выполнения. Например, для обычного вызова функции компилятору в точке активизации уже известно, какая из перегруженных функций будет вызвана. При обработке же исключения компилятор не знает, в какой функции находится catch-обработчик и откуда возобновится выполнение программы. Функция terminate() предоставляет механизм времени выполнения, который извещает пользователя о том, что подходящего обработчика не нашлось.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Просмотр стека вызовов
Просмотр стека вызовов В отладчике можно вывести окно Call Stack со списком всех активных процедур и функций сценария. Для этого нужно выполнить команду View|Call Stack. Например, если вызвать это окно, находясь внутри функции MyFunc() в сценарии ForDebug.js, то в списке мы увидим название
Раскрутка
Раскрутка После того как вы сделаете свой сайт доступным широкой общественности, ни в коем случае не следует останавливаться на достигнутом и опускать руки. Пока эта самая общественность о вашем детище еще ничего не знает. Чтобы сделать сайт по-настоящему доступным,
Раскрутка за деньги
Раскрутка за деньги Если у вас нет времени, но есть деньги, то раскрутку можно поручить пользователям, занимающимся этим профессионально. Существует множество сайтов, предлагающих услуги по увеличению количества посетителей интернет-ресурсов. Найти их несложно:
1.7.5. Многоуровневая архитектура стека TCP/IP
1.7.5. Многоуровневая архитектура стека TCP/IP Этот пункт книги является необязательным: если вы считаете, что у вас уже достаточно знаний о протоколе TCP/IP, то можете перейти к следующим разделам, а к этому вернуться позже. Здесь будет описана многоуровневая архитектура
27.1.1. Многоуровневая архитектура стека TCP/IP
27.1.1. Многоуровневая архитектура стека TCP/IP Протокол TCP/IP был создан в конце 60-х — начале 70-х годов агентством DARPA Министерства Обороны США (U.S. Department of Defense Advanced Research Projects Agency). Основные этапы развития этого протокола отмечены в таблице 27.1.Этапы развития протокола TCP/IP Таблица
Глава 4 РАСКРУТКА БЛОГА
Глава 4 РАСКРУТКА БЛОГА Как и зачем раскручивать блог Цель раскрутки или продвижения блога очень простая — если ваш блог не раскручен, то вы ничего не заработаете.Представьте популярного эстрадного исполнителя: что было бы, если бы он пел не на сцене, а дома в душе? Стал
Бесплатная раскрутка сайта
Бесплатная раскрутка сайта Раскрутка сайта дело довольно муторное, отнимающее много времени. Но результат, как правило, положительный. Но, прежде чем вообще что-то раскручивать, необходимо привести сайт в порядок, провести правильную его внутреннюю оптимизацию.
12. Запуск и раскрутка
12. Запуск и раскрутка Этап запуска и раскрутки инфопродукта мы будем обсуждать в других интеллект-картах.Таким образом мы реализуем каждую нашу идею. Самые главные – первые пункты, когда вы определяете дату и сколько кусочков должны записывать в день, чтобы дойти до даты
5. Базовая раскрутка партнерки
5. Базовая раскрутка партнерки Что делать для привлечения партнеров?? Рассказывайте о партнерской программе везде, на всех ваших сайтах – продающих и не продающих.? У профессионалов вы наверняка видели в конце каждого продающего текста или мини-сайта упоминание о
2. Раскрутка и продвижение (60 % времени)
2. Раскрутка и продвижение (60 % времени) В инфобизнесе на продвижение тратится 60 % времени. Это настройка источников трафика, таких как Яндекс. Директ, или контроль этого процесса, если он у вас на аутсорсинге. Партнерская программа, продающие тексты, их улучшение,
19.2.5. Раскрутка стека и вызов деструкторов
19.2.5. Раскрутка стека и вызов деструкторов Когда возбуждается исключение, поиск его catch-обработчика – раскрутка стека – начинается с функции, возбудившей исключение, и продолжается вверх по цепочке вложенных вызовов (см. раздел 11.3).Во время раскрутки поочередно