使用回调函数在C中进行错误处理

时间:2009-06-04 17:58:22

标签: c error-handling callback

我一直在考虑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更有用吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

但是你怎么能在预期的时候发现错误呢?例如,我可能希望文件打开失败,并希望在代码中处理它而不是通用错误捕获器。

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

我很久以前没有修改过库就做过这样的事情。我刚刚为进行错误检查的常见调用创建了包装函数。所以我的errchk_malloc调用检查了返回并在分配失败时引发了错误。然后我只是用这个版本代替内置的malloc。

答案 2 :(得分:0)

如果目标是在您遇到错误时立即彻底退出......但如果您想要进行最少的错误恢复,我无法看到您的方法如何有用......

为了避免这种问题,我有时会使用LD_PRELOAD_PATH来集成我的错误管理(仅适用于我自己的项目,因为这不是一个很好的做法......)

答案 3 :(得分:0)

真的想要改变LIBC的标准行为吗?您可以在常见功能周围添加一些扩展名。

例如,Gnome使用g_mallocg_try_malloc。前者将在失败时中止,而后者只会产生类似malloc的空指针。