//
//
begin:
int sz = get_size();
if (sz <= 0) {
goto begin;
}
При выполнении оператора goto
переменная sz
удаляется, а затем она определяется и инициализируется снова, когда управление передается назад за ее определение после перехода к метке begin
.
Упражнение 5.22. Последний пример этого раздела, с переходом назад к метке begin
, может быть написан лучше с использованием цикла. Перепишите код так, чтобы устранить оператор goto
.
try
и обработка исключений
Обработка исключений обычно используется в случае, когда некая часть программы обнаруживает проблему, с которой она не может справиться, причем проблема такова, что обнаружившая ее часть программы не может продолжить выполнение. В таких случаях обнаруживший проблему участок программы нуждается в способе сообщить о случившемся и о том, что он неспособен продолжить выполнение. Способ сообщения о проблеме не подразумевает знания о том, какая именно часть программы будет справляться с создавшейся ситуацией. Сообщив о случившемся, обнаружившая проблему часть кода прекращает работу.
Каждой части программы, способной передать исключение, соответствует другая часть, код которой способен обработать исключение, независимо от того, что произошло. Например, если проблема в недопустимом вводе, то часть обработки могла бы попросить пользователя ввести правильные данные. Если потеряна связь с базой данных, то часть обработки могла бы предупредить об этом пользователя.
Исключения обеспечивают взаимодействие частей программы, обнаруживающих проблему и решающих ее. Обработка исключений в языке С++ подразумевает следующее.
• throw
используется частью кода обнаружившего проблему, с которой он не может справиться. Об операторе throw
говорят, что он
• try
используется частью обработки исключения. Блок try
начинается с try
и завершается одной или несколькими catch
(catch
clause). Исключения, переданные из кода, расположенного в блоке try
, как правило, обрабатываются в одном из разделов catch
. Поскольку разделы catch
обрабатывают исключение, их называют также
• Набор определенных в библиотеке throw
и соответствующими разделами catch
.
В остальной части этого раздела три компонента обработки исключений рассматриваются последовательно. Более подробная информация об исключениях приведена в разделе 18.1.
5.6.1. Оператор throw
Обнаруживающая часть программы использует оператор throw
для передачи исключения. Он состоит из ключевого слова throw
, сопровождаемого выражением. Выражение определяет тип передаваемого исключения. Оператор throw
, как правило, завершается точкой с запятой, что делает его выражением.
Для примера вернемся к программе раздела 1.5.2, в которой суммируются два объекта класса Sales_item
. Она проверяет, относятся ли обе прочитанные записи к одной книге. Если нет, она отображает сообщение об ошибке и завершает работу.
Sales_item item1, item2;
cin >> item1 >> item2;
//
//
if (item1.isbn() == item2.isbn()) {
cout << item1 + item2 << endl;
return 0; //
} else {
cerr << "Data must refer to same ISBN"
<< endl;
return -1; //
}
В более реалистичной программе суммирующая объекты часть могла бы быть отделена от части, обеспечивающей взаимодействие с пользователем. В таком случае проверяющую часть можно было бы переписать так, чтобы она передавала исключение, а не возвращала свидетельство отказа.
//
//
if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN");