У вас действительно может быть функция / метод без тела, а только блок try / catch?
Вопрос
Обратите внимание, что эта функция не имеет " {" и "} " тело. Просто блок try / catch:
void func( void )
try
{
...
}
catch(...)
{
...
}
Это намеренно является частью C ++ или это расширение g ++?
Есть ли какая-то цель, кроме как обойти 1 уровень {}?
Я никогда не слышал об этом, пока не столкнулся с http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html р>
Решение
Да, это стандарт. Блоки try функций, как они называются, не так широко используются для обычных функций, но для конструкторов они позволяют вам ловить исключения, выброшенные в списке инициализатора.
Обратите внимание, что в случае конструктора исключение всегда будет перебрасываться в конце любых блоков catch.
Другие советы
Да, это действительно C ++. Одна цель, которую я нашел для этого, состоит в том, чтобы преобразовать исключения в возвращаемые значения, и иметь код, переводящий исключения в возвращаемых значениях, отдельно от другого кода в функции. Да, вы можете вернуть x;
из блока catch, подобного тому, который вы показали (на самом деле, я обнаружил это только недавно). Но я бы, вероятно, просто использовал другой уровень скобок и поместил try / catch внутри функции в этом случае. Это будет более знакомо большинству программистов C ++.
Другая цель - отловить исключения, выданные списком инициализатора конструктора, который использует аналогичный синтаксис:
struct f {
g member;
f() try {
// empty
} catch(...) {
std::cerr << "thrown from constructor of g";
}
};
У Херба Саттера есть хорошая статья на эту тему: http://www.gotw.ca/gotw /066.htm . р>