2014-07-24 30 views
0

我需要在中间停止程序流程,而且我正在为此使用异常。这个流程是合法流程,我想知道我是否可以在不使用例外的情况下进行。在没有使用异常的情况下停止中间的程序流程

这是我的代码的例子,我不能改变func_2func_1

#include "stdio.h" 

void func_3() 
{ 
    printf("i am func_3\n"); 
    throw 20; 
    printf("i am not supposed to be here\n"); 
} 
void func_2() 
{ 
    printf("i am func_2\n"); 
    func_3(); 
    printf("i am not supposed to be here\n"); 
} 
void func_1() 
{ 
    printf("i am func_1\n"); 
    func_2(); 
    printf("i am not supposed to be here\n"); 
} 

int main() 
{ 
    try 
    { 
     func_1(); 
    } 
    catch (int e) 
    { 
     printf("i am supposed to be here\n"); 
    } 
    catch (...) 
    { 
     printf("i am not supposed to be here\n"); 
    } 
} 
+6

'return;'? – JBentley

+0

试试这个:int * i = 0; * I = 20; – Kieveli

+1

@JBentley当你返回'func_3'时,如何让'func_2'和'func_1' **不执行它们的第二个'printf'?我想这就是OP想要的,没有例外,不需要修改'func_1/2'。 – leemes

回答

1

我假设你要处理的特殊情况,并正在寻找替代例外。即我希望你不想在处理你的例外情况后“正常地”继续这个程序,这是可能的,但不建议在例外的情况下执行。例外

可以,但不建议替换为:

  • 当你要停止你的整个应用程序,那么你可以使用std::exit(0);。你可以在你调用的函数中实现你的“catch”代码,而不是你的“throw”语句,并且在该函数结束时调用std::exit(0);(或者使用另一个退出代码来指示“不成功”退出)。或者您实施退出处理程序并使用std::atexit(&handle_exit);进行注册。

    std::exit(<something>);的替代方法是abort();,它引发POSIX信号“SIGABRT”以指示异常终止(如果程序抛出并且没有捕获异常,则这是缺省行为)。然后你的“catch”代码将进入你使用POSIX函数注册的信号处理程序。请注意,这需要POSIX系统,因此不像其他解决方案那样便携。

  • 另一个(类似的)选项是使用“终止”机制:当您通常会抛出异常时调用std::terminate();。把你的“catch”代码放在一个带有签名void(*)()的“终止句柄”函数中,即没有参数和没有返回值,让我们调用函数void handle_terminate()。使用std::set_terminate(&handle_terminate);安装终止处理程序。但是,我没有尝试过,听起来该死的很丑。

  • 使用汇编指令可以实现异常类似的行为,但请不要尝试这种在家里,因为这样的代码的行为是高度实现定义的(如果不是不确定的),和太丑陋执行。

0

Return可用于返回给调用者和停止功能正在执行

int GLOBAL_FLAG = 1; 

function called_function(){ 
    printf("Inside Function") 
    if(/*some condition*/) 
     { 
      GLOBAL_FLAG = 0; 
      return; 
     } 
    /*Normal function code*/ 
} 



    int main(){ 
    { 
    called_function(); 
    if(GLOBAL_FLAG == 1)/*continue program execution*/ 
    printf("Function had been executed.Back to normal flow") 
    } 

所以一旦return语句中遇到它可以追溯到callermain这里并继续执行休息在main函数中的陈述。

+1

注意:OP表示无法修改'func_1'和'func_2',这使得'return'不起作用,因为'func_1'和'func_2'中的剩余代码在'func_3'返回后仍然会被调用。 – crashmstr

+0

查看修改答案 –

+1

因为'func_1'被调用,所以它调用'func_2'(这两个都不是*可修改的),然后调用'func_3'(显然是唯一可修改的函数)。它是'func_3',它需要能够在没有任何代码执行到'main'之前跳回到'main'。 – crashmstr

0

总之,你不能(嗯......你可以通过使用跳转代替,但你必须问题解决)。

异常解决方案是使用的解决方案,但不要扔一个数字(一个数字 - 尤其是一个神奇的数字在这种情况下不会告诉你任何东西)。

而是定义一个struct func_3_interrupted {};简约结构,其类型名称告诉您它是func_3的“中断”,然后捕获它;该结构应该是空的(或接近空),它应该可能是而不是继承自std::exception层次结构。

相关问题