【问题标题】:Why is there no std::on_exit?为什么没有 std::on_exit?
【发布时间】:2016-04-15 15:14:26
【问题描述】:

程序可以以各种不同的状态码退出。
我想绑定一个退出处理程序,作为基于此状态代码处理最终任务的全部方法。
是否可以从退出处理程序中调度状态代码?
据我所知,No

因此,我无法获取状态值,如这个小例子所示:

#include <iostream>
#include <cstdlib>

int Get_Return_Code(){
  //can this be implemented?
  return 0;
}

void Exit_Handler() {

    // how do I get the return code
    // from within the exit heandler?
    auto return_code = Get_Return_Code(); //?

    // I'd like to make decisions based on the return code
    // while inside my exit handler
    if (return_code == EXIT_SUCCESS){
      std::cout << "perform exit successful tasks...\n";
    }
    else {
      std::cout << "perform exit failure tasks...\n";
    }
}

int main(int argc,  char** argv) 
{
    //bind the exit handler routine
    if (std::atexit(Exit_Handler)){
      std::cerr << "Registration failed\n";
      return EXIT_FAILURE;
    }

    //if an argument is passed, exit with success
    //if no argument is passed, exit with failure
    if (argc > 1){
      std::cout << "exiting with success\n";
      return EXIT_SUCCESS;
    }

    std::cout << "exiting with failure\n";
    return EXIT_FAILURE;
}

C++ 还没有包含on_exit 有什么原因吗?
我担心 windows 世界的交叉兼容性。

关于代码库:
我这样做的目标不涉及内存管理。我们有一个现有的代码库。到处都有退出语句。当程序因错误退出时,我想显示该错误代码对用户意味着什么。在我看来,这是无需重大重构的最快解决方案。

【问题讨论】:

  • 因为不需要?您现在可以做同样的事情,只需将您的代码包装在 try/catch/finally 块中。当语言没有异常处理时,需要退出处理程序
  • 您可以自己实现exit(),覆盖标准库版本,并在对数字代码执行任何操作后调用_exit()。我不确定这是一个好主意,但如果你真的必须这样做,它可能是一种获得你想要的东西的方法。
  • @PanagiotisKanavos 只需 try-catch,C++ 中不需要 finally
  • @juanchopanza 您无法捕获已经存在的退出语句。不过我同意,例外通常是更好的途径。

标签: c++ language-lawyer c++14 exit exit-code


【解决方案1】:

因为清理任务应该由您的析构函数执行,并且您的代码应该在任何情况下从任何范围内优雅地返回(通过returnthrow)。

at_exit 是 RAII 友好世界中的反模式。

如果您想根据您即将从main 返回的内容执行一些逻辑,只需在您即将从main 返回时执行它。在main.

【讨论】:

  • 这很公平。我的情况与内存管理无关。我们有一个现有的代码库。到处都有退出语句。当程序因错误退出时,我想显示错误代码对用户意味着什么。在我看来,这是无需重大重构的最快解决方案。
  • 从 main 返回后想要做某事的情况如何?
  • @Alex:然后你可以在main 中放任何你想要的东西,然后再返回。
  • @Alex:从main 回来后,你永远不想做某事。因为那样它就不再是真正的main了。
  • @LightnessRacesinOrbit 看看嵌入式启动代码有一些平台,在 main 之后挂钩会给您带来优势,因为您的操作系统已关闭;授予它不是posix。
【解决方案2】:

最简单和最便携的解决方案是将您的程序包装在一个 shell 脚本或其他程序中。然后,这个包装脚本或程序可以检查退出代码并向用户显示适当的消息。

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多