5.6.1. Оператор throw

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

Для примера вернемся к программе раздела 1.5.2, в которой суммируются два объекта класса Sales_item. Она проверяет, относятся ли обе прочитанные записи к одной книге. Если нет, она отображает сообщение об ошибке и завершает работу.

Sales_item item1, item2;

cin >> item1 >> item2;

// сначала проверить, представляют ли объекты item1 и item2

// одну и ту же книгу

if (item1.isbn() == item2.isbn()) {

 cout << item1 + item2 << endl;

 return 0; // свидетельство успеха

} else {

 cerr << "Data must refer to same ISBN"

      << endl;

 return -1; // свидетельство отказа

}

В более реалистичной программе суммирующая объекты часть могла бы быть отделена от части, обеспечивающей взаимодействие с пользователем. В таком случае проверяющую часть можно было бы переписать так, чтобы она передавала исключение, а не возвращала свидетельство отказа.

// сначала проверить, представляют ли объекты item1 и item2

// одну и ту же книгу

if (item1.isbn() != item2.isbn())

 throw runtime_error("Data must refer to same ISBN");

// если управление здесь, значит, ISBN совпадают

cout << item1 + item2 << endl;

Если теперь ISBN окажутся разными, будет передан объект исключения типа runtime_error. Передача исключения завершает работу текущей функции и передает управление обработчику, способному справиться с этой ошибкой.

Тип runtime_error является одним из типов исключения, определенных в заголовке stdexcept стандартной библиотеки. Более подробная информация по этой теме приведена в разделе 5.6.3. Объект класса runtime_error следует инициализировать объектом класса string или символьной строкой в стиле С (см. раздел 3.5.4). Эта строка представляет дополнительную информацию о проблеме.