【问题标题】:Should I throw PHP 7's Error classes in a library? [closed]我应该在库中抛出 PHP 7 的错误类吗? [关闭]
【发布时间】:2016-08-15 10:02:16
【问题描述】:

我已经开源了一个math library for PHP,它定义了它的own hierarchy of exceptions

现在 PHP 7 已经登陆,我意识到一些异常在引入新的Error 类时感觉有点多余:

让我们暂时忘记 PHP 5,并假设该库仅针对 PHP 7。

  • 我应该扔ArithmeticError 并放弃我的ArithmeticException 吗?
  • 同样,我应该扔掉DivisionByZeroError 并放弃DivisionByZeroException吗?
  • 应该RoundingNecessaryExceptionNumberFormatException 扩展ArithmeticError
  • 在这种情况下,它们应该被称为RoundingNecessaryErrorNumberFormatError吗?

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

同时,虽然没有什么能阻止用户空间代码抛出 Error,但我觉得这些类是由 PHP 本身设计的,用户空间库最好抛出 Exception 而不是 @987654342 @。

在这个问题上是否有共识?

【问题讨论】:

  • 致投票结束的人:投票结束一个问题的依据是“这个问题的答案几乎完全基于意见,而不是事实、参考资料或特定专业知识。”适得其反,有点“射击信使”。即使我们决定基于意见的答案(什么样的答案不是?)是一件坏事,然后谴责答案,而不是问题.尝试合作,嗯?判断一个情况的整体价值,而不是规则书中的诫命。如果你没有任何有用的东西要添加,只需慢跑。
  • TBH,我知道这个问题将成为“主要基于意见”的强迫选民的目标。我尽力寻求共识,而不是意见。也许创建Throwable RFC 的人写了一些关于这个主题的东西。也许对此有一个半官方的答案。谁知道。无论如何,我需要问!
  • PHP 错误异常旨在在发生 programmer 错误的情况下引发。无可否认,抛出的任何错误都应该与代码中的实际错误相关联。如果您对 Error 或其子类的使用符合此约束,您可以在代码中使用它们。 (这也意味着你不应该捕获这些异常,除非在你的顶级处理程序或非常不寻常的情况下。如果你的异常应该被捕获,那么 Error 不适合你。)
  • @NikiC 这是对我的例外情况的一个很好的反思。我想在某些情况下捕获 DivisionByZero 或 RoundingNecessary 异常是有意义的,甚至更多的是 NumberFormatException,尤其是在处理用户输入时。

标签: php exception php-7


【解决方案1】:

您将让 Stack Overflow 温和的文字主义者投票结束此问题,因为答案将“主要基于意见”。出于某种原因,SO 认为这很糟糕或与其他通常也是基于意见的答案不同,因为问题很少有单一答案。

这是一个合理的问题。

如果我们将问题的范围限制为简单的 DivisionByZeroError 和算术错误,那么我认为您应该在此处遵循 PHP 的标准化,并利用这些错误。这使您更接近于最小惊讶原则,因为它使您的代码与人们对自己的代码的期望步调一致 - 例如 - 除以零。所以这是一件好事(我认为可以客观地说)。

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

至于对于 RoundingNecessaryException 与 RoundingNecessaryError 等情况的非专门迎合...我认为将它们升级为错误是有意义的。我刚才在文档中找不到参考(其他人可能可以,并更新这个?),但他们声明错误是针对开发人员需要更改代码来修复的编程错误;异常仅用于异常的运行时行为。或大意的话。因此,如果想要使可能引发 RoundingNecessaryError 的方法工作,则需要进行必要的舍入。这是代码时的考虑,因此错误是有意义的。我认为这有点主观,因为对此没有简单的答案,但我认为基本原理是相当客观合理的。

【讨论】:

  • 感谢您的回答。关于不主动抛出DivisionByZeroError,这是不可能的,因为我没有在后台使用intdiv(),而是基于GMP、BCMath甚至普通PHP的不同计算器实现。我需要协调异常,以便将其保留为实现细节。
  • 关于 Errors 用于编程错误,这可能是有道理的,但我认为这只是增加了一些混乱,因为 PHP 在其 exception hierarchy 中已经为此提供了类:例如,@987654322 @“表示程序逻辑中的错误。这种异常应该直接导致代码中的修复”。因此,出于类似的原因,我们现在有 2 个可能的 throwable:ErrorLogicException。这就是为什么我认为,也许,Error 真的应该只由 PHP 抛出?
  • 那里有一些重叠。我只能推测 LogicException 早于 PHP7 引入的错误处理的修订版。此外,LogicException 与 DivisionByZeroError 更广泛(或只是不同)。但我真的不能这么说。 PHP 的错误处理方法总是让我有些困惑。它似乎对整个事情有一种非常奇怪的方法。
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 2019-10-13
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多