На этом шаге мы рассмотрим назначение и использование конструкции throw() в заголовке функции.
В соответствии с моделью создания и обработки исключительных ситуаций, принятой в данной версии C++, компилятор предполагает, что исключения, в том числе, могут выдаваться от выполнения оператора throw, в том числе и при выполнении функции. Заголовок функции может быть дополнен одной из следующих спецификаций:
Следовательно, это именно перечисление возможных исключений. К сожалению, компилятор не в состоянии проверить это утверждение и вынужден полагаться на программиста. А тот, как правило, cам не имеет возможности правильно их перечислить. Библиотечные функции описаны без указания исключений, то есть согласно стандарту могут "выбрасывать" любое исключение, следовательно, любая функция, обращающаяся к библиотеке, тоже может "выбросить" любое исключение, если только не перехватывает их все.
Приведем пример, иллюстрирующий указание перечисленных конструкций. Ниже приводится функция f1(), выдающая исключение, когда ее аргумент четное число. Результат работы представлен на рисунке 1.
// 2010_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <conio.h> // Функция, "запрограммированная" на // выдачу целочисленных исключений void f1(int i) throw (int) { //четное число (остаток от деления равен 0) if ( i%2 == 0 ) throw 1; //выдача "целочисленного" исключения } // Функция, "запрограммированная" на // выдачу исключений любого типа void f2(int j) throw(...) { f1(j); } void main() { for(int j=0; j < 10; j++) { try { f2(j); } catch(...) { printf ("j = %d\n", j); } } //for _getch(); //задержка экрана }
Рис.1. Результат работы приложения
Дополнительную информацию по обработке исключений можно получить здесь (шаги 1 - 7).
Со следующего шага мы начнем рассматривать преобразования между регулируемыми и нерегулируемыми указателями.