在没有括号的main()函数中尝试\ catch块

时间:2015-09-30 13:01:28

标签: c++ try-catch

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阻止也。对于代码的第二个变体,我没有这样的行为。

为什么会这样?

2 个答案:

答案 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块的用法/行为没有特殊用例。