//
cout << item1 + item2 << endl;
Если теперь ISBN окажутся разными, будет передан объект исключения типа runtime_error
. Передача исключения завершает работу текущей функции и передает управление обработчику, способному справиться с этой ошибкой.
Тип runtime_error
является одним из типов исключения, определенных в заголовке stdexcept
стандартной библиотеки. Более подробная информация по этой теме приведена в разделе 5.6.3. Объект класса runtime_error
следует инициализировать объектом класса string
или символьной строкой в стиле С (см. раздел 3.5.4). Эта строка представляет дополнительную информацию о проблеме.
5.6.2. Блок try
Блок try
имеет следующий синтаксис:
try {
} catch (
} catch (
операторы_обработчика
} // ...
Блок try
начинается с ключевого слова try
, за которым следует блок кода, заключенный в фигурные скобки.
Блок try
сопровождается одним или несколькими блоками catch
. Блок catch
состоит из трех частей: ключевого слова catch
, объявления (возможно, безымянного) объекта в круглых скобках (называется catch
совпадает с исключением, выполняется связанный с ним блок. По завершении выполнения кода обработчика управление переходит к оператору, следующему непосредственно после него.
в блоке try
являются обычными программными операторами, реализующими ее логику. Подобно любым другим блокам кода, блоки try
способны содержать любые операторы языка С++, включая объявления. Объявленные в блоке try
переменные недоступны вне блока, в частности, они не доступны в блоках catch
.
В приведенном выше примере, чтобы избежать суммирования двух объектов класса Sales_item
, представляющих разные книги, использовался оператор throw
. Предположим, что суммирующая объекты класса Sales_item
часть программы отделена от части, взаимодействующей с пользователем. Эта часть могла бы содержать примерно такой код обработки исключения, переданного в блоке сложения.
while (cin >> item1 >> item2) {
try {
//
//
// исключение runtime_error
} catch (runtime_error err) {
//
//
cout << err.what()
<< "\nTry Again? Enter y or n" << endl;
char c;
cin >> с;
if (!cin || с == 'n')
break; //
}
}
В блоке try
расположена обычная логика программы. Это сделано потому, что данная часть программы способна передать исключение типа runtime_error
.
Данный блок try
обладает одним разделом catch
, который обрабатывает исключение типа runtime_error
. Операторы в блоке после ключевого слова catch
определяют действия, выполняемые в случае, если код в блоке try
передаст исключение runtime_error
. В данном случае обработка подразумевает отображение сообщения об ошибке и запрос у пользователя разрешения на продолжение. Когда пользователь вводит символ 'n'
, цикл while
завершается, в противном случае он продолжается и считывает два новых объекта класса Sales_item
.
В сообщении об ошибке используется текст, возвращенный функцией err.what()
. Поскольку известно, что классом объекта исключения err
является runtime_error
, нетрудно догадаться, что функция what()
является членом (см. раздел 1.5.2) класса runtime_error
. В каждом из библиотечных классов исключений определена функция-член what()
, которая не получает никаких аргументов и возвращает символьную строку в стиле С (т.е. const char*
). В случае класса runtime_error
эта строка является копией строки, использованной при инициализации объекта класса runtime_error
. Если описанный в предыдущем разделе код передаст исключение, то отображенное разделом catch
сообщение об ошибке будет иметь следующий вид:
Data must refer to same ISBN
Try Again? Enter y or n