在C

问题描述:

错误处理使用回调函数

我一直在想以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

但是,在预期的情况下,您将如何捕捉错误?例如,我可能希望文件打开失败,并希望在代码中处理它而不是通用错误捕获器。

要做到这一点,你需要每个功能的两个版本。一个陷入错误,一个返回错误。

我很久以前就做了这样的事情,而没有修改库。我为创建错误检查的常见调用创建了包装函数。因此,如果分配失败,我的errchk_malloc调用会检查返回结果并提出错误。然后,我只是使用这个版本来代替内置的malloc。

在这几年我见过几次试图模仿的try/catch在ANSI C:

我认为的try/catch方法比更加简单你的。

如果您的目标是在您遇到错误时立即退出干净,但是如果您希望尽可能减少错误恢复,我无法看到您的方法如何有用...

为了避免这样的问题,我有时用LD_PRELOAD_PATH整合我的错误管理(只为我自己的项目,因为这不是一个很好的做法... ...)

真的想改变标准你的LIBC的行为?您可以在常用功能上添加一些扩展。

例如,Gnome使用g_mallocg_try_malloc。前者会在失败时放弃,而后者则会产生像malloc这样的空指针。