我一直在考虑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 :(得分:2)
这几年我见过几次尝试模仿ANSI C中的try / catch:
我认为try / catch方法比你的方法更简单。
答案 1 :(得分:1)
但是你怎么能在预期的时候发现错误呢?例如,我可能希望文件打开失败,并希望在代码中处理它而不是通用错误捕获器。
要做到这一点,你需要每个功能的两个版本。一个陷入错误,另一个收回错误。
我很久以前没有修改过库就做过这样的事情。我刚刚为进行错误检查的常见调用创建了包装函数。所以我的errchk_malloc调用检查了返回并在分配失败时引发了错误。然后我只是用这个版本代替内置的malloc。
答案 2 :(得分:0)
如果目标是在您遇到错误时立即彻底退出......但如果您想要进行最少的错误恢复,我无法看到您的方法如何有用......
为了避免这种问题,我有时会使用LD_PRELOAD_PATH来集成我的错误管理(仅适用于我自己的项目,因为这不是一个很好的做法......)
答案 3 :(得分:0)
您真的想要改变LIBC的标准行为吗?您可以在常见功能周围添加一些扩展名。
例如,Gnome使用g_malloc
和g_try_malloc
。前者将在失败时中止,而后者只会产生类似malloc
的空指针。