Я пытаюсь обернуть функцию библиотеки C, используя C ++. Функция пытается инициализировать устройство. В случае ошибки выполнение программы прекращается (возможно, при exit(1)
). Я хотел бы бросить исключение по ошибке вместо этого. Есть ли способ сделать это без редактирования источника C?
Можно ли как-то запретить вызываемой функции завершать программу?
устанавливать 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;
}
Если вы работаете в Unix / Linux, вы можете проверить с помощью strace
что именно ваша библиотека вызывает, то вы можете переопределить вызванную функцию, используя LD_PRELOAD
,
Не очень хорошее решение, но то, которое должно работать: раскошелиться на новый процесс и вызвать эту функцию C в дочернем процессе. В родительском процессе дождитесь завершения дочернего процесса, проверьте код ошибки, если он равен 1, что означает exit(1)
был вызван, исключение.