如果遇到错误,我有几个返回1的函数。每个函数都调用一个低级函数,这样如果低级函数返回1,原始函数也返回1。因此,错误会以这种方式传递到链中。
以下是其中一个功能的高度删节版本:
if (low_level_function()) {
[do stuff]
return 1;
}
[do other stuff]
return 0;
我是否应该声明一个错误变量,将low_level_function()的结果赋给它,然后在if()语句中使用错误变量?换句话说:
int error = low_level_function();
if (error) {
[do stuff]
return 1;
}
[do other stuff]
return 0;
或者还有另一种更好的方法吗?我以前从来没有编码来解释错误,所以我在这里的经历相当有限。
编辑:我重新格式化了这些函数,以更好地传达我的代码的本质。
答案 0 :(得分:2)
更喜欢第二种形式的一个原因是在错误情况下你没有任何事情可做,而你想避免嵌套if语句的阶梯效应。
int error_flag = low_level_function();
if (!error_flag)
error_flag = second_function();
if (!error_flag)
error_flag = third_function();
return error_flag;
当然,对于该特定示例,您可以使用||
的短路属性进行简化:
return low_level_function() || second_function() || third_function();
答案 1 :(得分:1)
你也可以使用它,
return low_level_function();
如果 low_level_function()在错误时返回非零值,在成功时返回零。或
return low_level_function()>0? 1 : 0;
答案 2 :(得分:1)
答案 3 :(得分:0)
虽然它是侧面评论我将首先声明我更喜欢一个退出任何方法。
他的构造的一个主要优点是只需要在一个地方需要错误记录声明。
此外,添加跟踪日志以进行调试也非常容易。
所以按照这个想法,我建议以下
#define OK (0)
int mid_level_func(....)
{
log_entry(...);
int rc = OK
{
...
if ((rc = low_level_func1(...)))
goto lblExit;
...
if ((rc = low_level_func2(...)))
goto lblExit;
...
lblExit:
;
}
if (OK != rc)
log_error(rc, ...);
log_exit(...);
return rc;
}
对于那些坚持goto
“邪恶”的人,上述方案的以下变体可能有所帮助:
#define OK (0)
int mid_level_func(....)
{
log_entry(...);
int rc = OK
do
{
...
if ((rc = low_level_func1(...)))
break;
...
if ((rc = low_level_func2(...)))
break;
...
} while (0);
if (OK != rc)
log_error(rc, ...);
log_exit(...);
return rc;
}