0

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

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

4

3 回答 3

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;
}
于 2012-11-22T14:46:27.920 回答
0

If you are on Unix/Linux, you can check with strace what exactly your library calls, then you can override called function using LD_PRELOAD.

于 2012-11-22T14:54:24.353 回答
0

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

于 2012-11-22T15:01:15.473 回答