从强制退出的 C 库函数生成异常
Generate exception from a C library function that forces quit
我正在尝试使用C++包装C库函数。该函数尝试初始化设备。出错时,它会强制程序的执行终止(可能带有exit(1)
)。我想在错误时抛出一个异常。有没有办法在不编辑 C 源的情况下做到这一点?
我可以以某种方式禁止被调用的函数终止程序吗?
安装atexit
处理程序,从处理程序引发异常。呸。
附言。因此,正如人们指出的那样,C++异常不起作用,那么我们使用 C"异常":
#include <cstdlib>
#include <iostream>
#include <csetjmp>
jmp_buf buf;
void foo ()
{
longjmp (buf, 1);
}
void bar () { exit(-1); }
int
main ()
{
atexit (foo);
if (setjmp (buf))
{
bar ();
}
else
{
std::cout << "graceful" << std::endl;
}
return 0;
}
如果你使用的是 Unix/Linux,你可以strace
检查你的库到底调用了什么,然后你可以使用 LD_PRELOAD
覆盖调用的函数。
不是一个超级好的解决方案,但应该可以工作:分叉一个新进程并在子进程中调用该 C 函数。在父进程中,等待子进程完成,检查错误码,如果为 1,表示调用了exit(1)
,则抛出异常。
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- 未捕获 Simdjson 库的 C++ 异常
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 好友库函数可以访问子数据
- 覆盖程序中的标准 C 库函数C++
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 返回time()库函数的数据类型
- 将C++中的多个参数传递给MatLab共享库函数
- 从另一个动态链接库项目调用静态库函数
- 导入的库函数是否可以在内存中移动
- 带参数的线程调用库函数
- 在 MASM 中调用标准库函数
- char concat c++ 没有库函数
- 为什么C++ std::min_element 库函数接受采用布尔返回类型的函数对象的函子,而不是像 C 中那样的 in
- 标准库函数 abs() 在不同C++编译器上的异常行为
- 从强制退出的 C 库函数生成异常
- 如何猜测 libpqxx C++库函数引发的异常类型
- 是在传递给库函数之前检查值更好,还是捕获抛出的异常更好