【发布时间】:2014-08-30 17:58:44
【问题描述】:
在 C 语言中,是否有一种模式可以消除在调用其他函数的函数中不断检查错误的需要?
例如如果函数 foo() 依次调用 a()、b() 和 c(),则必须在继续之前检查每个函数的返回值。如果 a()、b() 或 c() 还调用其他函数,这些函数也可能调用其他函数,这会留下一长串错误检查,可能是相同的错误...
int16_t a(x_t x) {return DO_SOME_WORK(x);}
int16_t b(y_t y) {return DO_OTHER_WORK(y);}
int16_t c(z_t z) {return DO_MORE_WORk(z);}
foo (x_t x, y_t y, z_t z) {
int16_t err = 0;
// I can handle errors returned by either:
err = a(x));
if (err) return err;
err = b(y);
if (err) return err;
err = c(z);
return err;
// Or
err = a(x);
if (!err) err = b(y);
if (!err) err = c(z);
return err;
}
我更喜欢第二种方法,因为它有一个明确的单一退出点,但另一种方法是本地化处理,并且任何一种方法都引入了很多 if,对于大型程序,这需要很多额外的代码,尤其是在什么都不做的函数中但例如调用其他函数并在它们之间传递输出。 谢谢
【问题讨论】:
-
我认为唯一其他真正的方法是通过
setjmp和longjmp“模拟异常”,但是您的程序流程变得不那么容易遵循了。此外,一种常见的编译器优化是将所有这些return err语句合并为一个,并将条件分支插入该语句。 -
err的值是 0 和 1,还是有许多不同的err值?根据答案,可以使用不同的成语。 -
@chux 有许多不同的 err 值,在最终返回的上层函数中,它们被推送到错误队列以报告给父系统。
标签: c error-handling embedded