防止不断检查错误的模式?

2023-12-26

在 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,并且对于大型程序,这会产生大量额外代码,尤其是在除了调用其他方法之外什么也不做的函数中。例如,函数并在它们之间传递输出。 谢谢


在这种情况下,您可以利用短路评估&&,当左手操作数是false,右侧操作数不被求值。

如果您可能想在调用之间执行其他处理a(), b() or c(),以下允许:

bool foo (x_t x, y_t y, z_t z) 
{
    bool err = a( x );
    err = err && b( y ) ;
    err = err && c( z ) ; 

    return err;
}

而如果函数仅由调用组成a(), b() or c(),那么你可以使用更简洁的:

bool foo (x_t x, y_t y, z_t z) 
{
    return a( x ) && 
           b( y ) && 
           c( z ) ; 
}

[响应评论而添加]

解决 @kkrambo 关于函数返回的任何数值不传播给调用者的观点是可以解决的,但作为解决方案越来越没有吸引力:

int16_t foo (x_t x, y_t y, z_t z) 
{
    int16_t ret ;

    bool err = (ret = a( x ));
    err = err && (ret = b( y )) ;
    err = err && (ret = c( z )) ; 

    return ret ;
}

or

int16_t foo (x_t x, y_t y, z_t z) 
{
    uint16_t ret ;

    (ret = a( x )) && 
    (ret = b( y )) && 
    (ret = c( z )) ;

    return ret ; 
}

增加恐怖程度你甚至可以这样做:

int16_t foo (x_t x, y_t y, z_t z) 
{
    int16_t err ;

    if( (err = a(x)) ) {}
    else if( (err = b(y)) ) {} 
    else if( (err = c(z)) ) {}

    return err ; 
}

简化为以下内容err是布尔值:

bool foo (x_t x, y_t y, z_t z) 
{
    bool err = true ;

    if( a(x) ) {}
    else if( b(y) ) {} 
    else if( c(z) ) {}
    else { err = false }

    return err ; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止不断检查错误的模式? 的相关文章

随机推荐