2014-02-14 66 views
2

我在Ubuntu 12.04中使用了eclipse。我在我的程序中使用了一些例外情况,当它们被抓到时,它给我正确的答案。但该计划持续到最后。有异常后停止程序的方法吗?程序不会异常后停止

这是我使用的代码:

try{ 
     if(BLER==-1) throw 12; 
    }catch(int exception){ 
     cout << "ERROR: BLER value is invalid for x= " << x << ", BLER_input= " << BLER_input << ", m= "<< m << endl; 
    } 
+0

为什么不尽早'返回'? – Proxy

+0

return;或退出(); ? –

+0

'catch'旨在在异常成功捕获后让程序继续运行。您可以直接在'catch'块中调用'abort()'或'exit()'。 –

回答

2

一些解决方案:

  1. 使用return从你的函数(和做相应的你的返回值),如果你在做这个该main()例程

  2. 使用exit(n)其中n是退出代码(http://www.cplusplus.com/reference/cstdlib/exit/

  3. abort()如果这是一个关键的问题(http://www.cplusplus.com/reference/cstdlib/abort/

通知:由詹姆斯·甘孜,exitabort指出将调用本地对象的析构函数。这是值得注意的,因为你正在处理类。

+0

我正在使用从一个主类使用的内部。我认为exit(n)和abort会更好。谢谢!!! – Shahab

+0

如果您使用退出,请记住,如果退出代码为0或EXIT_SUCCESS,则表示成功。否则失败。 –

+1

@DavidKernin这取决于实施。 '0'或'EXIT_SUCCESS'表示成功,'EXIT_FAILURE'表示失败,其他任何事情都是实现定义的。 (至少有一个公共系统要求返回代码的范围是0 ... 255。) –

1

使用功能退出:exit(1);,其中1是出射码(通常为非零信号错误)。如果您认为例外是严重错误,您也可以使用abort()

0

尝试使用命令return这样

return 0 //for successful termination or your preffered int status returned 
//or just 
return; 
//or (C++) 
[std::exit] 
0

要捕获异常后停止执行程序,只需调用std::exit()catch块:

#include <cstdlib> 
#include <iostream> 

int main() 
try 
{ 
    throw 42; 
} 
catch(int i) 
{ 
    std::cout << "Caught int: " << i << ". Exiting...\n"; 
    std::exit(EXIT_FAILURE); 
} 

Live demo here

这也适用于main之外。您可以用EXIT_FAILURE替换您想要的任何int值,portably in the 0-255 range

+0

可移植的,也许,但你不一定会得到你期望的结果。过去,至少有一个共同的系统把所有的偶数值都视为失败,除了0以外) –

+0

@James可移植的就像在“Windows和POSIX”中一样,这是一个相当包容的定义,其他系统非常特殊,它们在“便携式“意义 – rubenvb

+0

我不知道这一点IBM大型机仍然很普遍,但大多数现代系统虽然不一定是Posix,但它确实在某种程度上模拟了Unix接口(可能大多数实际系统都是嵌入并运行n无论是Windows还是Unix,但大多数人不会为这些系统编程。) –

2

如果可以/必须在当前函数处理这个问题,你可以(也应该)终止权有:

#include <iostream> 
#include <cstdlib> 

if (BLER == -1) 
{ 
    std::cout << "BLER value is invalid." << std::endl; 
    std::exit(EXIT_FAILURE); 
} 

例外意味着,当你有一个错误的条件被抛出,但不知道如何正确处理它。在这种情况下,你抛出一个异常代替的整数,可选给予在其构造中遇到的问题的指示......

#include <stdexcept> 

if (BLER == -1) 
{ 
    throw std::runtime_exception("BLER value is invalid"); 
} 

...并赶上地方调用树,其中你可以给出更好的错误信息,可以处理问题,重新抛出,或者根据你的选择终止)。如果程序没有被捕获(“未处理的异常”),则异常只会终止程序。这就是构造的整个想法。

抛出一个整数并在同一函数中捕获它是(ab-)使用异常作为函数goto

0

C++中的catch处理程序允许我们处理代码正常执行路径之外的错误。一旦处理完毕,C++认为恢复正常操作或程序是安全的。

如果情况并非如此,假设您只是想记录错误,那么您可以免费重置导致错误在堆栈中进一步传播的异常。

如果异常没有被捕获,C++函数std::terminate将被调用。默认行为是调用abort

可能是你做的最好的事情你的情况是通过在catch块的末尾调用throw来重新抛出这种怀疑。