我想用C++來包裝C庫函數。該函數嘗試初始化設備。出錯時,它強制程序的執行終止(可能與exit(1)
)。我想拋出一個異常,而不是錯誤。有沒有辦法做到這一點,而無需編輯C源代碼?從強制退出的C庫函數中生成異常
我可以以某種方式禁止被調用的函數來終止程序嗎?
我想用C++來包裝C庫函數。該函數嘗試初始化設備。出錯時,它強制程序的執行終止(可能與exit(1)
)。我想拋出一個異常,而不是錯誤。有沒有辦法做到這一點,而無需編輯C源代碼?從強制退出的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)
,則拋出異常。
它會調用你的函數,但是這個過程在那之後會被終止,所以它不會幫助 – qrdl
壞的庫。我覺得骯髒:) – chill
將工作?我正在閱讀http://www.cplusplus.com/reference/clibrary/cstdlib/atexit/「[...]如果使用atexit註冊的函數拋出一個它不提供處理程序的異常,則會自動調用terminate (C++)「。 – piokuc