我需要在中间停止程序流程,我目前正在使用异常。这个流程是合法的流程,我想知道我是否可以在不使用异常的情况下完成。
这是我的代码示例,我无法更改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");
}
}
答案 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
层次结构。