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

StackOverflow https://stackoverflow.com/questions/335839

  •  22-07-2019
  •  | 
  •  

Вопрос

Обратите внимание, что эта функция не имеет " {" и "} " тело. Просто блок 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top