Программирование на C и C++

Онлайн справочник программиста на C и C++

Задание ограничений на исключения

Когда функция вызывается из блока try, можно ограничить тип исключений, которые эта функ­ция может сгенерировать. Кроме того, можно вообще запретить этой функции генерировать ис­ключения. Для задания этих ограничений необходимо добавить к определению функции ключе­вое слово throw следующим образом:

возвращаемый_тип имя_функции {список аргументов) throw (список типов)
{
//...
}

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

Попытка генерации исключения, не поддерживающегося функцией, будет иметь своим резуль­татом вызов функции unexpected(). Обычно эта функция в свою очередь вызывает функцию terminate(). Можно задать свой собственный порядок обработки непредвиденных исключений с помощью функции set_expected(). Подробности можно найти в документации по Borland С++.

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

// ограничение на генерируемые функцией типы
#include <iostream.h>
// данная функция может сгенерировать только int, char и double
void Xhandler(int test) throw (int, char, double)
{
if(test==0) throw test; // генерация int
if(test==1) throw 'a'; // генерация char
if(test==2) throw 123.23; // генерация double
}
int main()
{
cout << "start\n";
try {
Xhandler(0); // попытка передать 1 и 2 в Xhandler()
}
catch (int i) {
cout << "Caught an integer\n";
}
catch (char c) {
cout << "Caught char\n";
}
catch(double d) {
cout << "Caught double\n";
}
cout << "end";
return 0;
}

В этой программе функция Xhandler() может генерировать исключения следующих типов: int, char и double. При попытке генерации исключения любого другого типа происходит аварийный останов программы. А именно: в таком случае вызывается функция unexpected(). Для того чтобы увидеть, как это происходит, надо удалить из списка тип int и перезапустить программу.

Ограничения на типы генерируемых функцией исключений распространяются только на исклю­чения, которые генерируются назад в блок try, из которого эта функция была вызвана. Однако если в функции содержится свой блок try, то она может генерировать любые исключения до тех пор, пока эти исключения перехватываются инструкциями catch внутри самой функции. Таким образом, ограничение распространяется только на исключения, выходящие наружу из функции. Следующие изменения в функции Xhandler() запрещают ей генерировать любые исключения:

// данная функция не может сгенерировать исключения
void Xhandler(int test) throw()
{
/* следующие операторы больше не работают. Они будут
вызывать аномальное завершение программы */
if(test==0) throw test;
if(test==1) throw 'a';
if(test==2) throw 123.23;
}