一个函数应该返回什么可以失败?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个函数应该返回什么可以失败?相关的知识,希望对你有一定的参考价值。

我的问题有点模糊,至少部分是故意的。我正在寻找有关接口设计,未来扩展和易于测试接口的早期建议,而不是太多关于确切的代码。虽然,如果它是一个特别适用于C ++(17)的解决方案/建议,那么这是完美的。

我有一个模拟解决了一个困难的组合问题。模拟逐步传播到解决方案。但有时候,一步就是死胡同(或者就是这样)。例如,在下面的伪代码中,while循环通过向片段馈送来传播模拟。在那里可能存在不能使用“片段”来传播模拟的情况。例如。这是昂贵的,它是一个根本不适合或任何理由的作品。失败是一种正常行为,可能无法中止。

while(!allNotHandledPieced.empty())
{
  auto nextPiece = allNotHandledPieces.back();
  allNotHandledPieces.pop_back();
  auto status = simulation.propagate(nextPiece);
  if(status == 0)
    next; // ok
  else if (status == 1)
    dropPieceDueToTooBadStatus();
}

实际上,对于“模拟”来说,失败的原因并不重要。状态仍然有效,使用另一件没有问题,它可以继续。但后来,我可能会发现需要知道“传播”方法失败的原因。那么在失败时获得有意义的返回值可能是有意义的。

有没有一种好方法可以回归'失败'?这种情况有最好的做法吗?

答案

从我可以收集到的情况来看,似乎既没有例外,也没有“返回”适合您的情况。在您的问题中,您谈到“返回结果”,但您的特定代码示例/用例表明,如果使用“坏块”,算法不应停止或中断。异常和从函数“返回”将导致更复杂的控制流,在某些情况下,更复杂的状态处理将取决于您处理异常的方式。

如果您选择例外路线,我建议您在system_error之后对“报告”类进行建模。

如果您选择非控制流路径,我建议将错误代码和其他元数据推送到另一个可以使用的数据结构中(如果该部件本身太昂贵而无法复制)。

你选择做什么取决于坏片是否需要立即采取行动。如果没有,则异常不是要走的路,因为这意味着它需要在某个时刻处理。

以上是关于一个函数应该返回什么可以失败?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 PDO 对象中返回啥来生成可靠的代码?

如何从 FragmentPagerAdapter 返回多个片段

为什么一个有返回类型但不返回任何东西的函数不会编译失败?

接口返回失败是啥意思

main 函数不返回任何内容。为啥? [复制]

自定义对话框片段