C语言下的错误处理的问题
下面是三种C语言的错误处理,你喜欢哪一种?还是都不喜欢?
/* 问题: 不充分,而且很容易出错,前面成功分配的资源,后面出错需要帮助释放 */
int foo(int bar)
{
int return_value = 0;
int doing_okay = 1;
doing_okay = do_something( bar );
if (doing_okay)
{
doing_okay = init_stuff();
}
if (doing_okay)
{
doing_okay = prepare_stuff();
}
if (doing_okay)
{
return_value = do_the_thing( bar );
}
return return_value;
}
/* 问题: 使用goto语句是很不好的 */
int foo(int bar)
{
if (!do_something( bar )) {
goto error;
}
if (!init_stuff( bar )) {
goto error;
}
if (!prepare_stuff( bar )) {
goto error;
}
return do_the_thing( bar );
error:
return 0;
}
/* 问题:太多的if嵌套了,无法阅读 */
int foo(int bar)
{
int return_value = 0;
if (do_something( bar )) {
if (init_stuff( bar )) {
if (prepare_stuff( bar )) {
return_value = do_the_thing( bar );
}
}
}
return return_value;
}

(3 人打了分,平均分: 4.33 )
用switch怎么样?
程序的逻辑是要顺序执行吧(如果都成功的话)。
我一般会选择第二种^_^
不过,如果每一步都比较简单的话,或者错误处理都相同,我会选择
if ( do_something() &&
init_stuff() &&
prepare_stuff() )
{
return do_the_ting();
}
else
{
return 0; /* return error. make sure you have cleaned up the enviroment e.g. free the memory you have allocated */
}
int foo(int bar)
{
do{
if (!do_something( bar )) {
break;
}
if (!init_stuff( bar )) {
break;
}
if (!prepare_stuff( bar )) {
break;
}
return do_the_thing( bar );
}while(0);
return 0;
}
这个方式怎么样呢?避免了goto的使用.:-)
@khb_gl
没必要弄得这么麻烦只为了避开 goto 吧。这里有一个关于 goto 的讨论: http://www.cplusplus.com/forum/beginner/16743/
我喜欢的方式:
int foo(int bar)
{
if (!do_something( bar ))
return 0;
if (!init_stuff( bar ))
return 0;
if (!prepare_stuff( bar ))
return 0;
return do_the_thing( bar );
}
我日,要这么复杂么,用setjmp longjmp这两个C的异常处理函数不就解决了。