程序在异常后不会停止

时间:2014-02-14 13:57:08

标签: c++ eclipse ubuntu

我在Ubuntu 12.04中使用eclipse。我在我的程序中使用了一些例外,当它们被捕获时,它正确地给了我cout。但该计划持续到最后。有没有办法在异常后停止程序?

这是我正在使用的代码:

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;
    }

6 个答案:

答案 0 :(得分:3)

一些解决方案:

  1. 如果您在main()例程中执行此操作,请使用函数中的return(并根据您的返回值执行此操作)

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

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

  4. 注意:正如James Kanze所述,exitabort NOT 调用本地对象的析构函数。这是值得注意的,因为你正在处理类。

答案 1 :(得分: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

答案 2 :(得分:1)

使用函数exit:exit(1);,其中1是退出代码(通常非零表示错误)。如果您将异常视为严重错误,也可以使用abort()

答案 3 :(得分:0)

尝试使用这样的返回命令

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

答案 4 :(得分:0)

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

#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

答案 5 :(得分:0)

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

如果不是这种情况,假设您只想记录错误,则可以自由地重新throw导致错误的异常进一步向上传播。

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

你可能最好的做法就是通过在catch块的末尾调用throw来重新抛出exeception。