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)代码>在该功能结束时(或使用另一个退出代码指示“不成功”退出)。或者实现退出处理程序并使用注册
是抛出POSIX信号“SIGABRT”以指示异常终止(如果程序抛出且未捕获异常,这是默认行为)。然后,您的“catch”代码将进入一个信号处理程序,您可以使用POSIX函数注册该处理程序。请注意,这需要POSIX系统,因此不像其他解决方案那样可移植std::exit()的替代方案
- 另一个(类似的)选项是使用“终止”机制:在通常抛出异常时调用。将您的“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
。