c – 从库中退出()是否可以抛出异常?

前端之家收集整理的这篇文章主要介绍了c – 从库中退出()是否可以抛出异常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > How to override exit(),perhaps by throwing exception3个
我正在使用C语言的C / Fortran库,并且库调用exit().我希望它抛出异常,以便调用我的C程序中的析构函数.我已经能够创建一个抛出异常的exit定义,但是仍然会调用terminate.是否阻止终止被调用并允许正常的异常处理发生?

更新:在评论中指出,这适用于x64但在x86上失败,因此主要问题是“有没有办法让x86像x64一样工作?”.

更新2:请参阅我的回复,了解为什么这不适用于x86以及如何解决它.

这是我的测试代码

test_exception.c

#include <stdlib.h>

void call_c() { exit(1); }

test_exception.cpp

#include <iostream>
#include <stdexcept>

extern "C" void call_c();

extern "C" void exit(int value)
{
  throw std::runtime_error(std::string("Throwing an exception: ") + char('0' + value));
}

int main()
{
  try {
    call_c();
  } catch (const std::exception &e) {
    std::cerr << e.what() << std::endl;
    return 1;
  }

  return 0;
}

使用以下命令构建:

gcc -c test_exception.c -o test_exception_c.o
g++ -c test_exception.cpp -o test_exception_cpp.o
g++ test_exception_c.o test_exception_cpp.o -o test_exception

解决方法

我知道你可能不想读这个,但是在它的任何部分尝试调用exit()或类似程序之后继续执行程序很可能是错误的.

如果程序的一部分名为exit(),则无法保证该程序的状态.您不知道堆是否处于一致状态.你不知道堆栈是否有用.如果将exit()转换为throw,那么每次发生这种情况时,您可能遇到的内存泄漏最少.您不知道是否可以再次安全地调用导致此错误的库.

如果您已经检查了库的源代码,并且您确定不会导致损坏,那么最干净的解决方案是修改库本身,以便它抛出而不是退出.

如果不允许更改库,则另一个干净且正确的解决方案是将库的所有用法放入一个可以监视和重新启动的单独进程中.

猜你在找的C&C++相关文章