Бьерн Страуструп.
Язык программирования С++
236
//
...
}
}
В зависимости от особой ситуации будет выполняться соответствующий обработчик. Если управление
дойдет до конца операторов обработчика, следующим будет выполняться оператор, который идет
после списка обработчиков:
void f()
{
try
{
use_vectors();
}
catch (Vector::Range) {
// исправить индекс и
// попробовать опять:
f();
}
catch (Vector::Size) {
cerr << "Ошибка в конструкторе Vector::Size";
exit(99);
}
// сюда мы попадем, если вообще не было особых ситуаций
// или после обработки особой ситуации Range
}
Список обработчиков напоминает переключатель, но здесь в
теле обработчика операторы break не
нужны. Синтаксис списка обработчиков отличен от синтаксиса вариантов case переключателя частично
по этой причине, частично потому, чтобы показать, что каждый обработчик определяет свою область
видимости (см. $$9.8).
Не обязательно все особые ситуации перехватывать в одной функции:
void f1()
{
try
{
f2(v);
}
catch (Vector::Size) {
//
...
}
}
void f2(Vector& v)
{
try
{
use_vectors();
}
catch (Vector::Range) {
//
...
}
}
Здесь f2() перехватит особую ситуацию Range, возникающую в use_vectors(), а особая ситуация Size
будет оставлена для f1().
С точки зрения языка особая ситуация считается обработанной сразу при входе в тело ее обработчика.
Поэтому все особые ситуации, запускаемые при выполнении этого обработчика, должны
обрабатываться в
функциях, вызвавших ту функцию, которая содержит проверяемый блок. Значит в
следующем примере не возникнет бесконечного цикла:
try {
//
...
Бьерн Страуструп.
Язык программирования С++
237
}
catch (input_overflow) {
//
...
throw
input_overflow();
}
Здесь input_overflow (переполнение при вводе) - имя глобального класса.
Обработчики особых ситуаций могут быть вложенными:
try {
//
...
}
catch (xxii) {
try
{
// сложная реакция
}
catch (xxii) {
// ошибка в процессе сложной реакции
}
}
Однако, такая вложенность редко бывает нужна в
обычных программах, и чаще всего она является
свидетельством плохого стиля.
0>
Достарыңызбен бөлісу: