我习惯在所有费用中避免使用goto
语句,因为它不建议使用c ++,
我仍然需要跳转到代码的底部并在发生错误时退出进程:
if ( cond1 )
{
if (cond2)
{
do_something();
return; // note the return
}else
{
goto error_oc;
}
}else
{
if() ...
return;
}
// should never be eached
error_oc:
error_message();
exit(1);
现在假设错误消息是一个复杂的消息,假设我们没有把它放在这样的函数中,所以我们必须编写两次复杂的msg代码,现在是一个更好的解决方案:
std::function <void(void)> error_lambda = [] (int code) {
// complex error msg here with captured variiables maybe
exit(code);
}
if ( cond1 )
{
if (cond2)
{
do_something();
return; // note the return
}else
{
error_lambda(1);
}
}else
{
if() ...
return;
}
// should never be eached
error_lambda(2);
解决方案与goto
解决方案的优缺点是什么?
答案 0 :(得分:2)
首先,您的两个代码仅相当于 ,因为您使用exit()
调用。否则,内部else
块会在离开error_lambda
语句后再调用if
一次,然后再调用error_lambda
。这已经表明,这种行为很可能依赖于goto
本身,IMO使代码难以阅读和维护。
另一方面,good reasons永远不会使用goto
。这只是邪恶的。忘了你听说过的。在我的一生中,我只使用了{{1}}一次而且我仍然为此感到羞耻(我太懒了,不能正确地重构代码)。
所以这是交易。您希望在出错时中断正常的代码执行。但是goto和lambda都不可维护。那么我们注定要失败吗?但是,嘿,你正在使用C ++。那么为什么不使用专门设计的机制来处理这种情况:例外?您可以创建自己的,自定义的(添加所需的任何自定义数据),抛出它然后将其捕获到外部并记录它或做任何你需要做的事情。