У вас действительно может быть функция / метод без тела, а только блок try / catch? - PullRequest
12 голосов
/ 03 декабря 2008

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 03 декабря 2008

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

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

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};
4 голосов
/ 03 декабря 2008

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

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

3 голосов
/ 03 декабря 2008

У Херба Саттера есть хорошая статья на это: http://www.gotw.ca/gotw/066.htm.

...