在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更有用?
答
但是,在预期的情况下,您将如何捕捉错误?例如,我可能希望文件打开失败,并希望在代码中处理它而不是通用错误捕获器。
要做到这一点,你需要每个功能的两个版本。一个陷入错误,一个返回错误。
我很久以前就做了这样的事情,而没有修改库。我为创建错误检查的常见调用创建了包装函数。因此,如果分配失败,我的errchk_malloc调用会检查返回结果并提出错误。然后,我只是使用这个版本来代替内置的malloc。
答
在这几年我见过几次试图模仿的try/catch在ANSI C:
我认为的try/catch方法比更加简单你的。
答
如果您的目标是在您遇到错误时立即退出干净,但是如果您希望尽可能减少错误恢复,我无法看到您的方法如何有用...
为了避免这样的问题,我有时用LD_PRELOAD_PATH整合我的错误管理(只为我自己的项目,因为这不是一个很好的做法... ...)
答
你真的想改变标准你的LIBC的行为?您可以在常用功能上添加一些扩展。
例如,Gnome使用g_malloc
和g_try_malloc
。前者会在失败时放弃,而后者则会产生像malloc
这样的空指针。
检查printf(...)== -1是没有用的,因为printf(...)返回打印的字符数并且不能小于0. – Kai 2009-06-04 18:06:41
“打印的字符数返回。如果发生错误,则返回-1。“ – Earlz 2009-06-04 18:11:21