Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

}

Здесь обработчик Overflow будет перехватывать ситуации типа Overflow, а обработчик Matherr будет перехватывать ситуации типа Matherr и всех типов, являющихся общими производными от Matherr, включая Underflow и Zerodivide.

Обработчики в проверяемом-блоке подбираются для данной особой ситуации в порядке их описания. Считается ошибкой, если обработчик для базового класса помещен перед обработчиком для производного класса, поскольку при таком расположении управление никогда не попадет к обработчику для производного класса.

Эллипсис …

в описании-особой-ситуации действует так же как, и в описании параметров функции, он сопоставим с любой особой ситуацией. Если задан эллипсис, то использующий его обработчик должен идти последним в проверяемом-блоке.

Если в проверяемом-блоке не произошло сопоставления ни с одним из обработчиков, поиск соответствующего обработчика продолжается в динамически объемлющем проверяемом-блоке. Если во всей программе не произошло сопоставления ни с одним обработчиком, вызывается функция terminate (§R.15.7).

Особая ситуация считается обработанной после входа в тело обработчика. В этот момент завершится "раскручивание стека".

R.15.5 Спецификации особых ситуаций

Возникновение и перехватывание особой ситуации влияет на взаимодействие функций. Список особых ситуаций, которые прямо или косвенно может запустить данная функция, можно задать как часть ее описания. Конструкция спецификация-особой-ситуации предшествует описателю функции.

спецификация-особой-ситуации:

 throw ( список-типов opt )

список-типов:

 имя-типа

 список-типов , имя-типа

Приведем пример:

void f throw (X,Y)

{

 //…

}

Если функция попробует запустить неуказанную в списке ситуацию, управление передается функции unexpected, см. §R.15.8.

Реализация языка не должна запрещать выражение только потому, что при его вычислении возможен запуск особой ситуации, не указанной в спецификации-особой ситуации описания функции. Обработка непредвиденных особых ситуаций происходит в динамике.

Функция, в которой отсутствует спецификация-особой-ситуации, может запустить любую особую ситуацию.

Функция с пустой спецификацией-особых-ситуаций (throw) не должна запускать никаких особых ситуаций.

Если функция может запустить особую ситуацию класса X, то она может запустить особую ситуацию любого класса, являющегося общим производным классом от X.

Конструкция спецификация-особой-ситуации не относится к типу функции.

R.15.6 Специальные функции

Механизм управления особыми ситуациями использует для реакции на ошибки при самой обработке особых ситуаций функции:

terminate
и
unexpected
.

R.15.6.1 Функция terminate

Иногда от предусмотренной обработки

особых ситуаций приходится переходить к более грубым приемам, например:

–  когда механизм управления особыми ситуациями не смог найти обработчик для запущенной особой ситуации;

–  когда механизм управления особыми ситуациями столкнулся с нарушенной структурой стека;

–  когда деструктор, вызванный в процессе раскрутки стека при запуске особой ситуации, сам пытается завершить выполнение программы, запустив особую ситуацию.

В этих случаях вызывается функция

void terminate;

Она в свою очередь вызывает функцию, которая была указана как параметр при последнем обращении к set_terminate:

typedef void(*PFV);

PFV set_terminate(PFV);

Функция, которая была задана в предыдущем вызове set_terminate, будет возвращаемым значением текущего вызова. Это помогает пользователю реализовать алгоритм восстановления стека. По умолчанию функция terminate вызывает abort.

Выбор с помощью terminate такой функции, которая вместо действительного завершения программы, пытается вернуться в вызвавшую программу, является ошибкой.

R.15.6.2 Функция unexpected

Если функция, имеющая спецификацию-особой-ситуации, запускает неуказанную особую ситуацию, то вызывается функция

void unexpected;

Она в свою очередь вызывает функцию, которая была задана как параметр при последнем обращении к set_unexpected:

typedef void(*PFV);

PFV set_unexpected(PFV);

Функция, которая была задана в предыдущем вызове set_unexpected, будет возвращаемым значением текущего вызова. Это помогает пользователю реализовать алгоритм восстановления стека. По умолчанию unexpected вызывает terminate. Поскольку по умолчанию terminate вызывает abort, результатом будет непосредственное и точное обнаружение ошибки.

R.15.7 Особые ситуации и правила доступа

Для формального параметра операции catch действуют такие же правила доступа, как и для формального параметра функции, в которой задана операция catch.

При запуске особой ситуации можно указывать такой объект, который можно копировать и уничтожать в области видимости функции, где задана операция throw.

R.16 Препроцессорная обработка

Реализация языка C++ включает препроцессор с возможностями макроподстановки, условной трансляции и включения указанных файлов.

Для передачи заданий препроцессору служат строки, начинающиеся с символа # (перед ним могут идти пробелы и символы горизонтальной табуляции). Такие строки называются командами, и их синтаксис определяется независимо от остального языка. Команды могут находиться в любом месте программы, и их действие продолжается (независимо от правил областей видимости С++) до конца данной единицы трансляции (§R.2).

Поделиться:
Популярные книги

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец

Сопряжение 9

Астахов Евгений Евгеньевич
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сопряжение 9

На три фронта

Бредвик Алекс
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
На три фронта

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец

Игра топа. Между двух огней

Вяч Павел
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Игра топа. Между двух огней

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10