//
//
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");