2016-04-22 48 views
2

我已经开源一个math library for PHP,定义其own hierarchy of exceptions我应该在库中抛出PHP 7的错误类吗?

现在PHP 7已经落地,我意识到一些例外觉得有点多余的推出了全新的Error类:

让我们忘了PHP 5一会儿,假设该库仅以PHP 7为目标。

  • 我应该丢掉ArithmeticError并放下我的ArithmeticException
  • 同样,我应该扔DivisionByZeroError并下降DivisionByZeroException
  • 应该RoundingNecessaryExceptionNumberFormatException延伸ArithmeticError
  • 在这种情况下,他们应该被称为RoundingNecessaryErrorNumberFormatError

乍一看,重新声明在语言中具有本机等价物的异常似乎很奇怪。

与此同时,虽然没有什么可以阻止用户级代码抛出Error,我觉得设计这些类通过PHP本身被抛出,而用户空间的库最好还是扔Exception而不是Error

在这个问题上有共识吗?

+0

致投票结束的人:基于“对这个问题的答案投票结束问题将倾向于几乎完全基于意见,而不是事实,参考或具体专业知识”。是适得其反的,有点“射击使者”。即使我们决定以意见为基础的答案(什么样的答案*不是*)是坏事,那么谴责答案*,而不是问题。试着去合作,呃?根据其整体价值判断一个情况,而不是规则书中的诫命。如果你没有任何有用的补充,只需慢跑即可。 –

+1

TBH,我知道这个问题将成为“主要是基于观点的”强迫选民的目标。我尽力争取达成共识,而不是意见。也许创建[Throwable RFC](https://wiki.php.net/rfc/throwable-interface)的人写了关于这个主题的东西。也许这是一个半官方的答案。谁知道。无论如何我需要问! – Benjamin

+1

PHP错误异常是在发生*程序员*错误的情况下引发的。抛出的任何错误都应该无可否认地链接到代码中的实际错误。如果您使用Error或其子类匹配此约束,则可以在您的代码中使用它们。 (这也意味着你不应该捕获这些异常,除了在你的顶级处理程序或非常不寻常的情况下。如果你的异常应该被捕获,那么Error是不适合你的。) – NikiC

回答

1

你将会有Stack Overflow渐进式文字表达式来关闭它,因为答案将是“主要基于观点的”。由于某些原因,SO认为这与其他一般也是基于意见的答案不一致或不同,因为问题很少有一个答案。

这是一个合理的问题。

如果我们要将问题的范围限制为DivisionByZeroError和Arithmetic错误,那么我认为您应该遵循PHP的标准化,并利用这些错误。这让你更加接近最简单的原则,因为它让你的代码与你自己的代码的期望一致 - 例如 - 除以零。所以这是一件好事(我认为可以客观地说)。

但是 - 现在这是主观的 - 我不会积极抛出这些错误,我只是让我的代码错误。IE:不要陷入困境并重新抛出同样的错误,只会让代码错误。它简化了您的代码(目标),并具有相同的最终结果(目标)。所以这与你的本能有关,即不应该抛出这些内置错误。但仅仅因为它没有必要:PHP会为你处理。我不会本质上说一个人不应该积极抛出这些错误,但我认为它是合法的(甚至是必要的)将是一个非正统的情况,所以它可能会乞讨的问题,如果它是正确的错误抛出。

至于像RoundingNecessaryException vs RoundingNecessaryError这样的非特殊情况......我认为将它们升级到错误是有意义的。我刚才找不到文档中的参考资料(其他人可能能够更新此文档?),但他们声明错误是编程错误,开发人员需要更改代码才能修复;并且异常仅用于特殊的运行时行为。或者这个效果的话。所以如果你想让你的方法可能会引发RoundingNecessaryError工作,那么需要做必要的舍入。这是一个代码时间的考虑,所以错误是有道理的。我认为这有些微不足道,因为对此没有削减和干预的单一答案,但我认为理由是相当客观的。

+0

感谢您的回答。关于不主动抛出'DivisionByZeroError',这是不可能的,因为我不是在底层使用'intdiv()',而是基于GMP,BCMath甚至普通PHP的不同计算器实现。我需要协调异常,以便保持实现细节。 – Benjamin

+0

关于'错误'是编程错误,这可能是有道理的,但我认为这只是增加了一些混淆,因为PHP已经在它的[异常层次结构]中为此提供了类(http://php.net/manual/en /spl.exceptions.php):例如[LogicException](http://php.net/manual/en/class.logicexception.php)“代表程序逻辑中的错误,这种异常应直接导致修复你的代码“。因此,对于类似的原因,我们现在有2个似是而非的throwable:'Error'和'LogicException'。这就是为什么我认为,也许'错误'实际上应该只由PHP抛出? – Benjamin

+0

那里有一些重叠。我只能猜测LogicException预先修改了PHP7引入的错误处理。此外,LogicException与DivisionByZeroError有些相似(或不同)。但我不能说真的。 PHP的错误处理方法一直让我感到困惑。整个事情似乎有一个非常奇怪的方法。 –