try блок
Исключение, выброшенное в блоке try, может быть обработано соответствующим обработчиком.
Синтаксис
try compound-statement handler-seq | (1) | |
try ctor-initializer (необязательно) compound-statement handler-seq | (2) |
| compound-statement | - | составной оператор |
| handler-seq | - | непустая последовательность обработчиков |
| ctor-initializer | - | список инициализаторов членов (только для конструкторов) |
Обычный блок try
Обычный блок try является оператором.
Если исключение выброшено из его compound-statement, оно будет сопоставлено с обработчиками в его handler-seq :
void f()
{
throw 1; // NOT handled by the handler below
try
{
throw 2; // handled by the associated handler
}
catch (...)
{
// handles the exception 2
}
throw 3; // NOT handled by the handler above
}
Функциональный блок try
Функциональный блок try — это особый вид тела функции.
Если исключение выброшено из его compound-statement или ctor-initializer (если он есть), оно будет сопоставлено с обработчиками в его handler-seq :
int f(bool cond)
{
if (cond)
throw 1;
return 0;
}
struct X
{
int mem;
X() try : mem(f(true)) {}
catch (...)
{
// handles the exception 1
}
X(int) try
{
throw 2;
}
catch (...)
{
// handles the exception 2
}
};
Исключения, выброшенные в деструкторах объектов со статической длительностью хранения или в конструкторах объектов, связанных с переменными вне блока со статической длительностью хранения, не перехватываются функциональным блоком try функции main.
| Исключения, выброшенные в деструкторах объектов с длительностью хранения потока или в конструкторах объектов, связанных с переменными вне блока с длительностью хранения потока, не перехватываются функциональным блоком try начальной функции потока. | (начиная с C++11) |
Выход за конец compound-statement обработчика функционального блока try равносилен выходу за конец compound-statement этого функционального блока try, если только функция не является конструктором или деструктором (см. ниже).
Блок try конструктора и деструктора
Для класса C, если тело функции в определении его конструктора или деструктора является функциональным блоком try и исключение выброшено во время инициализации или разрушения соответственно подобъектов класса C, оно также будет сопоставлено с обработчиками в handler-seq функционального блока try:
int f(bool cond = true)
{
if (cond)
throw 1;
return 0;
}
struct X
{
int mem = f();
~X()
{
throw 2;
}
};
struct Y
{
X mem;
Y() try {}
catch (...)
{
// handles the exception 1
}
~Y() try {}
catch (...)
{
// handles the exception 2
}
};
Обращение к любому нестатическому члену или базовому классу объекта в обработчике функционального блока try конструктора или деструктора этого объекта приводит к неопределённому поведению.
Если в обработчике функционального блока try конструктора появляется оператор return, программа некорректна.
Обрабатываемое в данный момент исключение повторно выбрасывается, если выполнение достигает конца обработчика функционального блока try конструктора или деструктора.
Поток управления
compound-statement блока try является оператором с ограниченным потоком управления:
void f()
{
goto label; // error
try
{
goto label; // OK
label: ;
}
catch (...)
{
goto label; // error
}
}
Оператор перехода (goto, break, return, continue) может использоваться для передачи управления за пределы блока try (включая его обработчики). В этом случае каждая переменная, объявленная в блоке try, будет уничтожена в контексте, непосредственно содержащем её объявление:
try
{
T1 t1;
try
{
T2 t2;
goto label; // destroy t2 first, then t1
}
catch(...)
{
// executed if an exception is thrown while destroying t2
}
}
catch(...)
{
// executed if an exception is thrown while destroying t1
}
label: ;
Ключевые слова
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованному стандарту | Правильное поведение |
|---|---|---|---|
| CWG 98 | C++98 | оператор switch может передать управление в compound-statement блока try | запрещено |
| CWG 1167 | C++98 | не было определено, будет ли функциональный блок try деструктора перехватывать исключения из деструктора базового класса или члена | такие исключения перехватываются |
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/try