c++ - 库中的 exit() 可以用抛出异常代替吗?

标签 c++ c exception

<分区>

我正在使用 C++ 中的 C/Fortran 库,该库调用 exit()。我希望它抛出一个异常,以便调用我的 C++ 程序中的析构函数。我已经能够创建一个抛出异常的 exit 定义,但仍然会调用 terminate。是否可以防止调用终止并允许发生正常的异常处理?

更新:在评论中指出这在 x64 上有效但在 x86 上失败,所以主要问题是“有没有办法让 x86 像 x64 一样工作?”。

更新 2:请参阅我关于为什么这在 x86 上不起作用以及如何修复它的回复。

这是我的测试代码:

测试异常.c

#include <stdlib.h>

void call_c() { exit(1); }

测试异常.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++ - 库中的 exit() 可以用抛出异常代替吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220263/

相关文章:

检查一个数字是否包含一对都是质数的组合

c - 通过内存分配连接字符串时出错

java - Jersey 异常映射不同的上下文

c++ - _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) 错误

html - 具有多个参数的协议(protocol)处理程序

c - 如何将文件的行保存在字符串表中?

java - 我有一个带有 @ExceptionHandler 的父类和一个带有自己版本的子类。我收到一个不明确的方法错误

python - 如何捕获此 Python 异常 : error: [Errno 10054] An existing connection was forcibly closed by the remote host

c++ - .NET:如何以编程方式确定 .NET 应用程序是否已编译?

c++ - std::map 迭代在第一次运行时出错