Visual Studio 2015; C ++语言。
我记得我在某处读到了关于入口点(即$re = '/\{\$([^.{}]+(?:\.[^.{}]+)+)\}/';
$str = "Welcome {\$user.first_name} to the {\$site} version 1.5. Your username is {\$user.username}. Your reputation at present is {\$user.reputation.name}";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
方法)的内容:
main
即。在这种情况下,#include <iostream>
using namespace std;
int main()
try{
return 0; // I am here...
}
catch (...){
cout << "I am 'catch'..." << endl; // This row wasn't called!
return 1; // Oops... But the next `F10` key pressing jumps from the "try"
// block into this row!
}
块不在括号中:
try\catch
这两种情况都已成功编译并且也可以正常工作,但是......在第一个版本中,当我逐步按int main() { // start bracket
try{
return 0;
}
catch (...){
return 1;
}
} // end bracket
块之后按F10
键时,我进入{{1阻止也。对于代码的第二个变体,我没有这样的行为。
为什么会这样?
答案 0 :(得分:9)
您的构造是 function-try-block ,并在drafs n4296中针对C ++ 11规范在8.4函数定义[dcl.fct.def.general]中定义:
函数定义的格式为
- 函数的定义:
- attribute-specifier-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt function-body
- 功能体:
- ctor-initializer opt compound-statement
- 功能试块
- =默认;
- =删除;
以及之后的15个异常处理[除]与:
功能试块:
- 尝试ctor-initializer opt compound-statement handler-seq
示例表明函数try-block的正常用法应该是ctor,但它对正常函数有效(而main在语法上只是一个函数)
它是有效且正常工作,这意味着只有在复合语句中的ctor-initializer opt 中发生异常时才会计算catch块。您可以在代码中通过在块中添加打印件或通过测试返回值来确认它。
在类Unix系统中
foo
echo $?
应该回复0
在CMD.exe窗口下的Windows系统中
foo.exe
if errorlevel 1 echo "Catch block"
不应输出Catch block
如果您的调试器允许您在catch块中执行指令...它不符合C ++ 11!
但是众所周知,当退出一个块时,MSVC调试器将光标放在块的最后一行,我认为这就是这里发生的事情,因为函数try-block 的最后一行是最后一行捕获。
答案 1 :(得分:-2)
C ++规范说明了这一点:
function-try-block将handler-seq与 ctor-initializer(如果存在)和复合语句。 执行复合语句期间抛出的异常,或for 构造函数和析构函数,在初始化期间或 分别破坏了阶级的子对象,转移 以与a相同的方式控制函数try-block中的处理程序 在执行try-block传输控件期间抛出的异常 给其他处理者。
构造函数或任何其他函数中的函数try块的用法/行为没有特殊用例。