2012-11-22 20 views
0

我想用C++來包裝C庫函數。該函數嘗試初始化設備。出錯時,它強制程序的執行終止(可能與exit(1))。我想拋出一個異常,而不是錯誤。有沒有辦法做到這一點,而無需編輯C源代碼?從強制退出的C庫函數中生成異常

我可以以某種方式禁止被調用的函數來終止程序嗎?

回答

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; 
} 
+3

它會調用你的函數,但是這個過程在那之後會被終止,所以它不會幫助 – qrdl

+0

壞的庫。我覺得骯髒:) – chill

+1

將工作?我正在閱讀http://www.cplusplus.com/reference/clibrary/cstdlib/atexit/「[...]如果使用atexit註冊的函數拋出一個它不提供處理程序的異常,則會自動調用terminate (C++)「。 – piokuc

0

如果你是在Unix/Linux,你可以用strace檢查究竟你的庫調用,然後你可以使用LD_PRELOAD覆蓋所謂的功能。

0

不是一個超好的解決方案,而是一個應該工作的方法:分叉一個新進程並在子進程中調用該C函數。在父進程中,等待孩子完成,檢查錯誤代碼,如果它是1,表示調用exit(1),則拋出異常。