我创建了一个类来尝试异常:
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”字符串,这是正常的吗?怎么避免这个?
答案 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) {
// ...
}