我需要在中间停止程序流,目前我正在使用一个异常。这个流程是合法的流程,我想知道我是否可以在不使用异常的情况下完成它。
这是我的代码示例,我不能更改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");
}
}发布于 2014-07-24 19:40:59
我假设您想要处理异常情况,并且正在寻找异常的替代方案。也就是说,我希望你不想在处理了你的异常情况后继续“正常”地使用程序,这是可能的,但不建议在异常情况下实现。
可能但不推荐的异常替代方案包括:
std::exit(0);。您可以在调用的函数中实现“捕获”-code,而不是“抛出”-statement,并在该函数结束时调用std::exit(0); (或者使用另一个退出代码来指示“不成功”退出)。或者实现一个退出处理程序并使用std::atexit(&handle_exit);注册它。std::exit(<something>);的替代方案是abort();,它抛出POSIX信号"SIGABRT“来指示异常终止(如果您的程序抛出并且没有捕获异常,这是默认行为)。然后,您的“捕获”-code将进入一个信号处理程序,您可以使用POSIX函数注册该处理程序。注意,这需要一个POSIX系统,因此不像其他solutions.
std::terminate();。将你的“catch”函数放在一个带有签名void(*)()的"terminate -code“函数中,也就是说,没有参数,也没有返回值,让我们调用这个函数void handle_terminate()。使用std::set_terminate(&handle_terminate);安装终止处理程序。
发布于 2014-07-24 19:41:10
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")
}因此,一旦遇到返回语句,它就会返回到这里为main的caller,并继续执行main函数中的其余语句。
发布于 2014-07-24 19:44:14
简而言之,你不能(嗯.你可以通过使用跳转来代替,但这样你就有两个问题要解决了)。
异常解决方案是要使用的解决方案,但不要抛出数字(数字-尤其是本例中的神奇数字不能告诉您任何事情)。
相反,定义一个struct func_3_interrupted {};极简主义结构,它的类型名称告诉您它是func_3的“中断”,并捕获它;该结构应该为空(或接近于空),并且它可能不应该从std::exception层次结构继承。
https://stackoverflow.com/questions/24932545
复制相似问题