11.3.4. Перехват всех исключений
11.3.4. Перехват всех исключений
Иногда функции нужно выполнить определенное действие до того, как она завершит обработку исключения, даже несмотря на то, что обработать его она не может. К примеру, функция захватила некоторый ресурс, скажем открыла файл или выделила память из хипа, и этот ресурс необходимо освободить перед выходом:
void manip() {
resource res;
res.lock(); // захват ресурса
// использование ресурса
// действие, в результате которого возбуждено исключение
res.release(); // не выполняется, если возбуждено исключение
}
Если исключение возбуждено, то управление не попадет на инструкцию, где ресурс освобождается. Чтобы освободить ресурс, не пытаясь перехватить все возможные исключения (тем более, что мы не всегда знаем, какие именно исключения могут возникнуть), воспользуемся специальной конструкцией, позволяющей перехватывать любые исключения. Это не что иное, как предложение catch, в котором объявление исключения имеет вид (...) и куда управление попадает при любом исключении.
Например:
// управление попадает сюда при любом возбужденном исключении
catch (...) {
// здесь размещаем наш код
}
Конструкция catch(...) используется в сочетании с повторным возбуждением исключения. Захваченный ресурс освобождается внутри составной инструкции в catch-обработчике перед тем, как передать исключение по цепочке вложенных вызовов в результате повторного возбуждения:
void manip() {
resource res;
res.lock();
try {
// использование ресурса
// действие, в результате которого возбуждено исключение
}
catch (...) {
res.release();
throw;
}
res.release(); // не выполняется, если возбуждено исключение
}
Чтобы гарантировать освобождение ресурса в случае, когда выход из manip() происходит в результате исключения, мы освобождаем его внутри catch(...) до того, как исключение будет передано дальше. Можно также управлять захватом и освобождением ресурса путем инкапсуляции в класс всей работы с ним. Тогда захват будет реализован в конструкторе, а освобождение – в автоматически вызываемом деструкторе. (С этим подходом мы познакомимся в главе 19.)
Предложение catch(...) используется самостоятельно или в сочетании с другими catch-обработчиками. В последнем случае следует позаботиться о правильной организации обработчиков, ассоциированных с try-блоком.
Catch-обработчики исследуются по очереди, в том порядке, в котором они записаны. Как только найден подходящий, просмотр прекращается. Следовательно, если предложение catch(...) употребляется вместе с другими catch-обработчиками, то оно должно быть последним в списке, иначе компилятор выдаст сообщение об ошибке:
try {
stack.display();
for ( int ix = 1; ix
Упражнение 11.4
Объясните, почему модель обработки исключений в C++ называется невозвратной.
Упражнение 11.5
Даны следующие объявления исключений. Напишите
выражения throw, создающие объект-исключение, который
может быть перехвачен указанными обработчиками:
(a) class exceptionType { };
catch( exceptionType *pet ) { }
(b) catch(...) { }
(c) enum mathErr { overflow, underflow, zeroDivide };
catch( mathErr &ref ) { }
(d) typedef int EXCPTYPE;
catch( EXCPTYPE ) { }
Упражнение 11.6
Объясните, что происходит во время раскрутки стека.
Упражнение 11.7
Назовите две причины, по которым объявление исключения в предложении catch следует делать ссылкой.
Упражнение 11.8
На основе кода, написанного вами в упражнении 11.3, модифицируйте класс созданного исключения: неправильный индекс, использованный в операторе operator[](), должен сохраняться в объекте-исключении и затем выводиться catch-обработчиком. Измените программу так, чтобы operator[]() возбуждал при ее выполнении исключение.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
10.6.4. Перехват сигналов: sigaction()
10.6.4. Перехват сигналов: sigaction() Наконец мы готовы взглянуть на функцию sigaction(). Эта функция сложна, и мы намеренно опускаем множество деталей, которые предназначены для специального использования. Стандарт POSIX и справочная страница sigaction(2) предоставляют все подробности,
12.2.3. Перехват сигналов
12.2.3. Перехват сигналов Вместо использования функции signal() (чья семантика в процессе эволюции стала неправильной) POSIX-программы регистрируют обработчики сигналов с помощью sigaction().#include <signal.h>int sigaction(int signum, struct sigaction *act, struct sigaction *oact);Этот системный вызов устанавливает
1996 г.: война всех против всех
1996 г.: война всех против всех Избрание Билла Клинтона не повернуло вспять волну дерегулирования. Ему пришлось согласиться, что «эпоха большого правительства» закончена — мнение, которое относилось как к режиму вмешательства властей в экономику, так и к концепции
10.7.1. Перехват соединения
10.7.1. Перехват соединения Вспомним полный цикл соединения с FTP-сервером и передачи файлов:1. Соединение с сервером.2. Авторизация.3. Запрос на скачивание файлов.4. Сервер открывает порт и сообщает его клиенту.5. Клиент подключается к указанному порту и получает или передает
14.5.4. Перехват соединения
14.5.4. Перехват соединения Атака на компьютеры с помощью перехвата соединения была первый раз применена еще несколько десятков лет назад, и до сих пор единственным эффективным методом борьбы с ней является использование шифрования пакетов.Когда компьютеры по протоколу TCP
Перехват сигналов
Перехват сигналов Вы можете использовать встроенную в bash программу trap для перехвата сигналов в своих программах. Это хороший способ изящно завершать работу программы. Например, если пользователь, когда ваша программа работает, нажмет CTRL-C — программе будет отправлен
14.1.2. Перехват вывода программы
14.1.2. Перехват вывода программы Простейший способ перехватить информацию, выведенную программой, — заключить команду в обратные кавычки, например:listing = `ls -l` # Одна строка будет содержать несколько строчек (lines).now = `date` # "Mon Mar 12 16:50:11 CST 2001"Обобщенный ограничитель %x
Обработка исключений
Обработка исключений Ввиду того, что теперь метод Accelerate() может генерировать исключение, вызывающая сторона должна быть готова обработать такое исключение. При вызове метода, способного генерировать исключение, вы должны использовать блок try/catch. Приняв исключение, вы
2.6. Использование исключений
2.6. Использование исключений Исключениями называют аномальные ситуации, возникающие во время исполнения программы: невозможность открыть нужный файл или получить необходимое количество памяти, использование выходящего за границы индекса для какого-либо массива.
11. Обработка исключений
11. Обработка исключений Обработка исключений – это механизм, позволяющий двум независимо разработанным программным компонентам взаимодействовать в аномальной ситуации, называемой исключением. В этой главе мы расскажем, как генерировать, или возбуждать, исключение в
11.3. Перехват исключений
11.3. Перехват исключений В языке C++ исключения обрабатываются в предложениях catch. Когда какая-то инструкция внутри try-блока возбуждает исключение, то просматривается список последующих предложений catch в поисках такого, который может его обработать.Catch-обработчик состоит
Типы исключений
Типы исключений Может появиться три типа исключений.* Ошибки SQL - т. е. сообщения SQL, имеющие отрицательное значение SQLCODE.* Внутренние ошибки Firebird, которые имеют отношение к конкурирующему взаимодействию, данным, метаданным и условиям окружения. У них есть девяти- символьный
26.3.1. Перехват сигналов и выполнение действий
26.3.1. Перехват сигналов и выполнение действий А теперь создадим сценарий, выполняющий подсчет итераций до тех пор, пока пользователь не нажмет комбинацию клавиш [Ctrl+C] (сигнал 2). После этого сценарий отобразит сообщение, содержащее номер текущей итерации цикла.В этом
Глава 11 Перехват сеанса
Глава 11 Перехват сеанса В этой главе обсуждаются следующие темы: • Основные сведения о перехвате сеанса • Популярные инструментальные средства перехвата сеанса • Исследование атак типа MITM в зашифрованных соединениях · Резюме · Конспект · Часто задаваемые вопросы
Перехват
Перехват Одним из наиболее мощных средств в борьбе с преступлениями, диверсиями и мятежами является возможность перехватывать письменные и устные коммуникации. Именно эту привилегию ФБР отстаивает особенно рьяно.Перехват давно известен в американской истории. В 1624