在C语言中,是否有一种模式可以消除在调用其他函数的函数中不断检查错误的需要?
例如,如果函数foo()依次调用a()、b()和c(),则必须在继续之前检查每个函数的返回值。如果a()、b()或c()还调用其他函数,可能还会调用其他函数,这将留下一个可能是相同错误的长序列的错误检查...
我倾向于第二种方法,因为它有一个明确的单一退出点,但是另一种方法本地化了处理,并且这两种方法都引入了很多if语句。对于大型程序来说,这意味着很多额外的代码,特别是在那些只是调用其他函数并在它们之间传递输出的函数中。 谢谢。
例如,如果函数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
语句合并为一个,并插入有条件的分支到该语句。 - Drew McGowenerr
值是 0 和 1 还是有许多不同的err
值?根据答案,使用不同的习语。 - chux - Reinstate Monica