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; }
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《C语言下的错误处理的问题》的相关评论
用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的异常处理函数不就解决了。
上HN了:http://news.ycombinator.com/item?id=3883310
个人感觉C语言中处理异常的三种方法应该是如下三种:
1. 检查函数的返回值来发现异常错误,并通过调用perror()函数将错误原因进行打印。
2. 使用signal()和raise()函数
使用signal()设置信号,调用raise引发信号,并进入相应的异常处理过程。
3. 使用非局部跳转函数
可以调用C标准库中的非局部跳转函数setjmp()和longjmp()来进行异常处理。
不知道是否还有更好的方法,望大虾们给出指点
果断 goto ! 用在这里最好了.
第二个完全可以用 || 啊,前面条件不满足后续也不会求值。
if (!do_something( bar )||(!init_stuff( bar )|| (!prepare_stuff( bar ))||do_the_thing( bar ) {
return do_the_thing( bar );
}
return 0;
@fire
错了是&&。。。一直分不清
int foo(int bar) {
if (do_something(bar) && init_stuff() && prepare_stuff())
return do_the_thing(bar);
真意外没人提到这解法,《C陷阱与缺陷》有提到:在 if 的判断条件句里,若其中一个子表达式为 false, 后面就不会执行了。
goto
setjmp longjmp不知道怎么用
不管怎么用都没有C++来的方便