微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,那么每次发生这种情况时,您可能遇到的内存泄漏最少.您不知道是否可以再次安全地调用导致此错误的库.

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

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

原文地址:https://www.jb51.cc/c/118859.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐