在不使用异常的情况下停止中间的程序流程

时间:2014-07-24 11:34:09

标签: c++

我需要在中间停止程序流程,我目前正在使用异常。这个流程是合法的流程,我想知道我是否可以在不使用异常的情况下完成。

这是我的代码示例,我无法更改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");
    }
}

3 个答案:

答案 0 :(得分:1)

我假设你想要处理一个例外情况,并且正在寻找异常的替代方案。即我希望你不想继续这个计划"通常"在处理您的例外情况之后,这可能但不建议在例外情况下实施。

可能但不推荐的例外替代方案是:

  • 如果要停止整个应用程序,则可以使用std::exit(0);。您可以在您调用的函数中实现" catch" -code而不是" throw" -statement,并在该函数结束时调用std::exit(0);(或使用另一个退出代码表示"不成功"退出)。或者您实现退出处理程序并使用std::atexit(&handle_exit);注册它。

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

  • 另一个(类似的)选项是使用&#34;终止&#34;机制:当您通常抛出异常时调用std::terminate();。将你的&#34; catch&#34; -code放入&#34;终止处理程序&#34;使用签名void(*)()的函数,即没有参数和没有返回值,让我们调用函数void handle_terminate()。使用std::set_terminate(&handle_terminate);安装终止处理程序。然而,我并没有尝试那个,听起来真是太丑了。

  • 可以使用汇编指令实现类似异常的行为,但请不要在家中尝试,因为此类代码的行为是高度实现的定义(如果没有未定义),并且实施起来太难看了。

答案 1 :(得分: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语句,它将返回caller main,并继续执行main函数中的其余语句。

答案 2 :(得分:0)

简而言之,你不能(嗯......你可以通过使用跳转来代替,但那时你会遇到两个问题)。

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

相反,定义一个struct func_3_interrupted {};简约结构,其类型名称告诉您它是一个&#34;中断&#34; func_3,并抓住它;结构应该为空(或接近空),它可能继承std::exception层次结构。