在C

2009-06-04 71 views
2
錯誤處理使用回調函數

我一直在想以C錯誤處理所產生的困難..像究竟是誰呢在C

if(printf("hello world")==-1){exit(1);} 

但你不這樣做,例如冗長,而且通常無用打破通用標準編碼。那麼如果你有一個libc的包裝呢?像這樣,你可以做這樣的事情..

//main... 
error_catchall(my_errors); 
printf("hello world"); //this will automatically call my_errors on an error of printf 
ignore=1; //this makes it so the function will return like normal and we can check error values ourself 
if(fopen.... //we want to know if the file opened or not and handle it ourself. 
} 

int my_errors(){ 
    if(ignore==0){ 
     _exit(1); //exit if we aren't handling this error by flagging ignore 
    } 
return 0; 
//this is called when there is an error anywhere in the libc 
} 
... 

我正在考慮作出這樣的包裝,因爲我綜合我自己的BSD許可的libc(所以我已經有觸摸碰不得..),但我想知道人們對它的看法。 這實際上是否會在現實生活中起作用,並且比返回-1更有用?

+0

檢查printf(...)== -1是沒有用的,因爲printf(...)返回打印的字符數並且不能小於0. – Kai 2009-06-04 18:06:41

+1

「打印的字符數返回。如果發生錯誤,則返回-1。「 – Earlz 2009-06-04 18:11:21

回答

1

但是,在預期的情況下,您將如何捕捉錯誤?例如,我可能希望文件打開失敗,並希望在代碼中處理它而不是通用錯誤捕獲器。

要做到這一點,你需要每個功能的兩個版本。一個陷入錯誤,一個返回錯誤。

我很久以前就做了這樣的事情,而沒有修改庫。我爲創建錯誤檢查的常見調用創建了包裝函數。因此,如果分配失敗,我的errchk_malloc調用會檢查返回結果並提出錯誤。然後,我只是使用這個版本來代替內置的malloc。

0

如果您的目標是在您遇到錯誤時立即退出乾淨,但是如果您希望儘可能減少錯誤恢復,我無法看到您的方法如何有用...

爲了避免這樣的問題,我有時用LD_PRELOAD_PATH整合我的錯誤管理(只爲我自己的項目,因爲這不是一個很好的做法... ...)

0

真的想改變標準你的LIBC的行爲?您可以在常用功能上添加一些擴展。

例如,Gnome使用g_mallocg_try_malloc。前者會在失敗時放棄,而後者則會產生像malloc這樣的空指針。