Spec-Zone.ru › C++

try блок

Исключение, выброшенное в блоке try, может быть обработано соответствующим обработчиком.

Синтаксис

try compound-statement handler-seq (1)
try ctor-initializer (необязательно) compound-statement handler-seq (2)
1) Обычный блок try.
2) Функциональный блок try. compound-statement должен быть составным оператором в теле функции.
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: ;

Ключевые слова

try

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API