异常不会中断指令流

时间:2012-02-05 23:53:56

标签: c++

我创建了一个类来尝试异常:

class precExcp:exception
{
    public:
    virtual const char* what()
    {
        return "Precision must be positive";
    }
};

问题是当启动异常时,指令流不会停止。 我不知道这是c ++的默认行为。 如果是,如果我想在异常发生时中断指令流怎么办? 这是我在main中做的一个例子:

int main(int argc, char **argv)
{
    try
    {
        if(1)
            throw precExcp();
    }
    catch(precExcp& e)
    {
        cerr << e.what() <<endl;
    }
    cout << "hello" <<endl;
}

在屏幕上打印“hello”字符串,这是正常的吗?怎么避免这个?

5 个答案:

答案 0 :(得分:4)

如果您发现异常,则会将其视为已处理,并在try / catch块的结尾处继续执行。

如果您希望异常继续向上继续(并且可能导致程序在未捕获时暂停),则向throw添加catch

catch(precExcp& e)
{
    cerr << e.what() <<endl;
    throw;
}

如果你想在那里停止程序而不是向上传播异常或让恢复执行,你可以在这种情况下调用exit(或return,但仅仅因为你在{ {1}})。

答案 1 :(得分:1)

是的,这是正常的:您抓住 catch块中的异常,因此异常不会传播到try / catch - 块之外它被提出来了。

答案 2 :(得分:1)

根据我从你的问题中可以理解的内容,如果你想跳过“hello”输出,把它放在try块中。

try
{
   if(1)
       throw precExcp(); // throwing here will skip all remaining 
                         // instructions in the try block
    cout << "hello" <<endl;
}
catch(precExcp& e)
{
    cerr << e.what() <<endl;
}

另请注意,这不是Java或Python。 C ++异常处理通常不要求您定义或捕获太多不同的异常类型,因为您的主要恢复源将是析构函数(@see RAII),这通常消除了需要多个catch分支(如以及最后一块)。通常你可以捕获 const std :: exception&amp; (使precExcp成为它的子类),并且只在极少数情况下你需要更细粒度的检查。

你也可以重新抛出:

try
{
   if(1)
       throw precExcp(); // throwing here will skip all remaining 
                         // instructions in the try block
}
catch(precExcp& e)
{
    cerr << e.what() <<endl;
    throw; // throw the original exception
}

但是,如果你在main中执行此操作并且没有catch块来捕获第二次抛出,那么它会因未处理的异常而崩溃,这可能是您正在寻找的,也可能不是。

答案 3 :(得分:0)

这是正常行为,您的不稳定代码放在try块中,当某些内容不合适时应该执行catch块,当您可以处理异常时,在此过程之后您可以使用可选{成功finally之后调用的{1}}阻止try之后失败。在该代码正常执行后,代码执行仅在catch块中停止,当您想要停止执行此函数时,需要try(在return块中)。

答案 4 :(得分:0)

嗯,你抓到了抛出的异常,所以这很正常。如果try块内发生异常,请放置您不想执行的代码部分:

try {
    throw precExcp();
    cout << "hello" <<endl;
}
catch(precExcp &e) {
    // ...
}