gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:46:18 27 4
gpt4 key购买 nike

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

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

最佳答案

我假设您想要处理异常情况并且正在寻找异常的替代方法。 IE。我希望您在处理异常情况后不想“正常”继续该程序,这是可能的,但不建议在有异常(exception)情况下实现。

可能但不推荐的异常(exception)替代方案是:

  • 当您想停止整个应用程序时,可以使用 std::exit(0); 。 .您可以在调用而不是“throw”语句的函数中实现“catch”代码,然后调用 std::exit(0);在该函数的末尾(或使用另一个退出代码来指示“不成功”退出)。或者你实现一个退出处理程序并使用 std::atexit(&handle_exit); 注册它.

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

  • 另一个(类似的)选项是使用“终止”机制:调用 std::terminate(); 当您通常会抛出异常时。将您的“捕获”代码放入带有签名的“终止处理程序”函数中 void(*)() ,即没有参数也没有返回值,让我们调用函数void handle_terminate() .使用 std::set_terminate(&handle_terminate); 安装终止处理程序.不过,我没试过那个,听起来真他妈难看。

  • 可以使用汇编指令实现类似异常的行为,但请不要在家里尝试,因为此类代码的行为是高度实现的已定义(如果不是未定义的话),而且实现起来太丑陋了。

关于c++ - 在不使用异常的情况下在中间停止程序流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com