从强制退出的C库函数生成异常

时间:2012-11-22 14:43:06

标签: c++ exception exit

我正在尝试使用C ++包装C库函数。该函数尝试初始化设备。出错时,它会强制执行程序终止(可能使用exit(1))。我想在错误上抛出异常。有没有办法在不编辑C源的情况下执行此操作?

我可以以某种方式禁止被调用函数终止程序吗?

3 个答案:

答案 0 :(得分:1)

安装atexit处理程序,从处理程序中抛出异常。啊。

PS。因此,正如人们指出的那样,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;
}

答案 1 :(得分:0)

如果您使用的是Unix / Linux,则可以使用strace检查您的库调用的内容,然后使用LD_PRELOAD覆盖被调用的函数。

答案 2 :(得分:0)

不是一个非常好的解决方案,但应该可以工作:分叉一个新进程并在子进程中调用该C函数。在父进程中,等待子进程完成,检查错误代码,如果为1,则表示调用exit(1),抛出异常。