尝试在main()函数中使用不带括号的catch块
trycatch block in the main() function without brackets
Visual Studio 2015;c++语言。
我记得我在某个地方读过关于入口点(即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!
}
。在这种情况下,trycatch
块不在括号内:
int main() { // start bracket
try{
return 0;
}
catch (...){
return 1;
}
} // end bracket
两种情况都编译成功并且也可以工作,但是…在第一个变体中,当我在try
块之后逐步按下F10
键时,我也进入了catch
块。对于代码的第二个变体,我没有这样的行为。
为什么会发生?
你的构造是一个 Function -try-block,在c++ 11规范的n4296草案8.4 Function definitions [dcl.fct.def.general]中定义:
函数定义的形式为
- 函数定义:
- 属性-指定符-seqopt decl-指定符-seqopt声明符virt-指定符-seqopt function-body
- 函数体:
- ctor-initializer <子>选择子>复合语句
- function-try-block
及以后版本15异常处理[except] with:
function-try-block:
- 尝试变量初始化opt复合语句处理程序-seq
示例表明,函数-try-block的正常用法应该是一个actor,但它对一个普通函数也是有效的(并且main在语法上仅仅是一个函数)
有效且正常工作,这意味着只有在复合语句中的opt on的变量初始化器中出现异常时,才会计算catch块。您可以在代码中通过在块中添加打印或测试返回值来确认它。
在类似Unix的系统中
foo
echo $?
应该回显0
在Windows系统下的CMD.exe Windows
foo.exe
if errorlevel 1 echo "Catch block"
不应该输出Catch block
如果你的调试器允许你在catch块中执行指令…它不符合c++ 11 !
但是众所周知,当退出块时,MSVC调试器将光标放在块的最后一行,我认为这就是这里发生的事情,因为函数-try-block 的最后一行是 catch的最后一行。
c++规范规定:
function-try-block将handler-seq与(如果存在)和复合语句。在执行复合语句或for期间引发的异常构造函数和析构函数,在初始化或分别销毁类的子对象,转移控件到函数尝试块中的处理程序的方法与在执行尝试块传输控制期间抛出的异常给其他处理程序。
在构造函数或任何其他函数中,try块的用法/行为没有特殊的用例。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 代码在main()中运行,但在函数中出现错误
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么catch中的代码没有被执行
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 函数是否可以访问传递给main()的参数
- catch框架有没有办法比较流或文件
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- 我的 int main() 中出现堆栈溢出错误
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么类和 main() 函数中也有动态内存分配
- 在 main.cpp 的上下文中找不到目录(带有 CMake 的快板)
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- 在大型应用程序的main上使用try-catch
- 函数try catch语法和main
- 尝试在main()函数中使用不带括号的catch块