C++ 例外情况-VC+中的错误行为+;2015年CTP终极版

C++ 例外情况-VC+中的错误行为+;2015年CTP终极版,c++,exception,C++,Exception,我有一个计划: #include<iostream> using namespace std; class Test { public: void func() { cout << "Inside func" << endl; throw; } }; int myfunc() { Test T; T.func(); return 1; } int main() { m

我有一个计划:

#include<iostream>
using namespace std;

class Test
{
public:
    void func()
    {
        cout << "Inside func" << endl;
        throw;
    }
};

int myfunc()
{
    Test T;
    T.func();
    return 1;
}

int main()
{
    myfunc();
    cout << "Main func" << endl;//should not print
    getchar();
}
#包括
使用名称空间std;
课堂测试
{
公众:
void func()
{

cout
在没有参数的情况下抛出
,当在不正确的上下文中调用时,应该调用
终止

根据标准:

没有操作数的抛出表达式将重新抛出当前处理的异常

如果当前没有处理异常,则在没有操作数的情况下执行抛出表达式调用
std::terminate()

然后,行为取决于当前安装的
std::terminate\u处理程序
,但无论如何执行都应该终止

所需行为:
terminate\u处理程序
应在不返回的情况下终止程序的执行 给打电话的人

默认行为:实现的默认
终止\u处理程序
调用
中止
。 默认实现调用
std::abort


我猜您正在VS debug环境中运行测试程序。请尝试在发布版本中编译您的程序,并通过单击可执行文件来运行它。异常错误框将弹出,并且不会打印“Main func”。 事实上,VS debugger中的行为是一个特性,而不是一个bug

微软表示:

在VisualStudio中,当抛出异常或最终未处理异常时 调试器可以帮助您调试这些代码,方法是将其断开,就像它在运行时断开一样 一个断点被击中


在这一点上,开发人员可以排除错误,或者继续执行将导致海报看到的行为的执行,即打印他问题中的
主函数。

看起来有点奇怪。您是否有自定义
终止处理程序
?不,我只有此代码,没有其他修改。假设exaMPE没有安装,abort()显然没有被调用,似乎是。但我不愿意说基本的东西坏了。@顺便说一句,我不能用VS 2015(14.0.23107.0)复制它。应用程序按预期终止。在调试器模式下?您的版本比我的版本最新。您能提供用于编译的编译器标志吗?如果使用VS2015的最终版本会发生什么?CTP非常旧,在RTM和CTP之间还有一个RC。@namezero:我在哪里找到它?无论如何,我没有像我们一样更改默认设置ll.@namezero:在问题中更新。一周前。它显示了预期的行为。不再需要使用预发布版本;)调试生成也应该足够了(可观察的行为参数)。附加了调试程序后,通常会在abort()中触发断点@namezero:当我切换到发布模式时,它会给出预期的行为。我在发布之前用发布的方式进行了测试。调试器的行为与发布可执行文件不同。调试器允许打印“Main func”,但发布版可执行文件没有。因此,我通过解释我观察到的VS行为而获得了否决票?@simon不是我。但是,如果调试和发布版本之间的行为发生变化,这会引起警钟。你能在
抛出;
前后发布程序集吗?我没有VS2015。