C++ 在中间停止程序流而不使用异常 我需要在中间停止程序流,我现在对此使用异常。这个流程是合法的流程,我想知道我是否可以不使用异常就完成它

C++ 在中间停止程序流而不使用异常 我需要在中间停止程序流,我现在对此使用异常。这个流程是合法的流程,我想知道我是否可以不使用异常就完成它,c++,C++,这是我的代码示例,我无法更改func_2和func_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

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

我假设您想要处理一个异常情况,并且正在寻找异常的替代方案。也就是说,我希望您在处理您的异常情况后,不希望继续“正常”执行该计划,这是可能的,但不建议在异常情况下执行

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

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

    std::exit()的替代方案
    是抛出POSIX信号“SIGABRT”以指示异常终止(如果程序抛出且未捕获异常,这是默认行为)。然后,您的“catch”代码将进入一个信号处理程序,您可以使用POSIX函数注册该处理程序。请注意,这需要POSIX系统,因此不像其他解决方案那样可移植

  • 另一个(类似的)选项是使用“终止”机制:在通常抛出异常时调用。将您的“catch”-代码放入带有签名的“terminate handler”函数
    void(*)(
    ),即没有参数也没有返回值,让我们调用函数
    void handle\u terminate()
    。使用安装终止处理程序。我没有试过,但是,它听起来非常丑陋

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


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语句,它就会返回到调用方,也就是这里的
main
,并继续执行
main
函数中的其余语句。

简而言之,您不能(好吧……您可以改为使用跳转,但是您将有两个问题需要解决)

异常解决方案是要使用的,但不要抛出一个数字(一个数字——特别是在这种情况下,一个神奇的数字不会告诉你任何事情)


相反,定义一个
struct func_3_{}最小结构,其类型名称告诉您这是func_3的“中断”,并捕获它;结构应该是空的(或接近空的),并且它可能不应从
std::exception
层次结构继承?试试这个:int*i=0*i=20@JBentley在返回
func_3
时,如何使
func_2
func_1
不执行第二次
printf
?我想这就是OP想要的,没有异常,没有修改
func_1/2
。您可以尝试setjmp和longjmpI,强烈反对滥用异常来控制程序流逻辑。使用它们来处理异常情况(如在实际点无法恢复的错误)。注意:OP says不能修改
func_1
func_2
,这会使
返回
无效,因为
func_1
func_2
中的剩余代码仍将在
func_3
返回后调用。不,因为调用了
func_1
,它调用了
func_2
(这两个都是不可修改的),然后调用
func_3
(显然是唯一可修改的函数)。
func_3
需要能够跳回到
main
,而不执行任何代码,直到到达
main