Ответ 1
Ваша конструкция является функцией-try-block и определена в drafs n4296 для спецификации С++ 11 в 8.4. Определения функций [dcl.fct.def.general] с помощью:
Определения функций имеют вид
- Функция-определение:
- атрибут-specifier-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt function-body
- Функция тела:
- ctor-initializer opt составной оператор
- Функция попробуйте-блок
- = default;
- = delete;
а затем в 15 Обработка исключений [кроме] с помощью:
Функция-примерочный блок:
- попробуйте ctor-initializer opt обработчик составных операторов-seq
Примеры предполагают, что нормальное использование для функции-try-блока должно быть ctor, но оно справедливо для нормальной функции (и основная синтаксически простая функция)
Он действителен и работает нормально, что означает, что блок catch оценивается только в том случае, если исключение происходит в ctor-initializer opt в составном заявлении. Вы можете подтвердить это в своем коде, добавив отпечатки в свои блоки или проверив возвращаемое значение.
В системе Unix
foo
echo $?
должен эхо 0
В системе Windows под окнами CMD.exe
foo.exe
if errorlevel 1 echo "Catch block"
не выводить Catch block
Если ваш отладчик позволяет выполнять команды выполнить в блоке catch... это не соответствует С++ 11!
Но известно, что при выходе из блока отладчик MSVC помещает курсор в последнюю строку блока, я предполагаю, что это то, что происходит здесь, потому что последняя строка функции-try-block равна последняя строка catch.