Подтвердить что ты не робот

Можете ли вы действительно иметь функцию/метод без тела, а просто блок try/catch?

Обратите внимание, что эта функция не имеет тела "{" и "}". Просто блок try/catch:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

Является ли это намеренно частью С++ или это расширение g++?

Есть ли какая-либо цель для этого, кроме обхода 1 уровня {}?

Я никогда не слышал об этом, пока не столкнулся с http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

4b9b3361

Ответ 1

Да, это стандарт. Функциональные блоки try, как их называют, не так много используются для регулярных функций, но для конструкторов они позволяют вам перехватывать исключения, внесенные в список инициализации.

Обратите внимание, что в случае конструктора исключение всегда будет возвращено в конце любых блоков catch.

Ответ 2

Да, это действительно С++. Одна из целей, которую я нашел для этого, заключается в том, чтобы переводить исключения в возвращаемые значения и иметь код, переводящий исключения в возвращаемых значениях отдельно от другого кода в функции. Да, вы можете return x; из блока catch, как тот, который вы показали (я только недавно обнаружил, что на самом деле). Но я бы, вероятно, просто использовал другой уровень фигурных скобок и поставил try/catch внутри функции в этом случае. Он будет более знаком большинству программистов на С++.

Другая цель - уловить исключения, созданные списком инициализатора конструктора, который использует аналогичный синтаксис:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};