c ++ goto vs std :: function lambda?

时间:2018-03-17 16:05:44

标签: c++ lambda error-handling goto

我习惯在所有费用中避免使用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解决方案的优缺点是什么?

1 个答案:

答案 0 :(得分:2)

首先,您的两个代码仅相当于 ,因为您使用exit()调用。否则,内部else块会在离开error_lambda语句后再调用if一次,然后再调用error_lambda。这已经表明,这种行为很可能依赖于goto本身,IMO使代码难以阅读和维护。

另一方面,good reasons永远不会使用goto。这只是邪恶的。忘了你听说过的。在我的一生中,我只使用了{{1}}一次而且我仍然为此感到羞耻(我太懒了,不能正确地重构代码)。

所以这是交易。您希望在出错时中断正常的代码执行。但是goto和lambda都不可维护。那么我们注定要失败吗?但是,嘿,你正在使用C ++。那么为什么不使用专门设计的机制来处理这种情况:例外?您可以创建自己的,自定义的(添加所需的任何自定义数据),抛出它然后将其捕获到外部并记录它或做任何你需要做的事情。