Nic*_*eld 3 c error-handling short-circuiting
我想知道是否有一种更好的方法来处理C中的情况,只要在一系列表达式中遇到错误就要退出函数.(在这种情况下,它是一个在出错时返回NULL的函数)
例如,在某些C代码中,他们试图通过将一系列语句与AND(&&)组合来实现短路错误处理.
return doSomething() &&
doSomething2() &&
doSomething3() && ... ;
Run Code Online (Sandbox Code Playgroud)
这让我感到恼火,因为我们在一个声明中一行填写了这么多内容.但我想替代方案是
if (!(value = doSomething()))
return NULL;
if (!(value = doSomething2()))
return NULL;
etc
return value;
Run Code Online (Sandbox Code Playgroud)
但是我在perl和bash脚本中看到的短路错误评估呢?
int die(int retvalue) {
exit(retvalue);
}
.....
(value = doSomething()) || die(1);
(value = doSomething2()) || die(2);
(value = doSomething3()) || die(3);
return value;
Run Code Online (Sandbox Code Playgroud)
这个问题的主要问题是RHS必须是一个表达式,所以你不能真正转到函数或从函数返回.有人会发现这个有价值的还是有限的?
编辑:我想我应该在第一个例子中包含换行符.问题是如果你决定在中间添加另一个表达式,你需要小心.
我已经看到在C中使用GOTO就是出于这个目的.
因为在C中没有'finally'结构,所以即使你提前退出函数,也需要一种释放所有内存的方法.
所以它基本上如下(如果我错了,有人可以纠正我的C语法,我有点生疏)
int foo()
{
/* Do Stuff */
if(!DoSomething())
GOTO Failure;
if(!DoSomething2())
GOTO Failure;
if(!DoSomething3())
GOTO Failure;
/* return success */
return true;
Failure:
/* release allocated resources */
/* print to log if necessary */
return false;
}
Run Code Online (Sandbox Code Playgroud)
重要说明 不要将GOTO用于执行流程.它们只应在出错时使用,并且只能转到当前函数的末尾.如果你将它们用于其他任何事情,你就会创造意大利面条代码,这可能会破坏现实的结构.只是不要这样做.
编辑
正如其中一张海报所指出的那样,使用Exit(x)会终止你的整个程序,这会使该解决方案保留给致命错误.但是,您在一行中的原始建议解决方案(DS()&& DS2()&& DS3())会导致错误处理问题.
如果您希望将函数包装在某种特定于函数的错误处理中,则在将函数调用全部包装在一行中时无法执行此操作.所以,至少你可以做点什么
int result1 = 0;
int result2 = 0;
int result3 = 0;
result1 = DoSomething();
if(result1)
result2 = DoSomething2();
if(result2)
result3 = DoSomething3();
return result1 && result2 && result3;
Run Code Online (Sandbox Code Playgroud)
因为此方法不会排除错误处理.