【问题标题】:How specific should exception classes be?异常类应该有多具体?
【发布时间】:2012-08-02 16:14:32
【问题描述】:

作为一项规则,我会尽量避免抛出异常实例,因为这并不能传达太多关于问题所在的信息。

但我发现我得到了相当多的空异常类,它们看起来像这样......

class DataNotFoundException extends Exception {
   // just a tagging class
}

所以在功能上该类与 Exception 相同。唯一的功能意义是我现在可以做到这一点......

try {
    ... some code which throws exceptions ...
} catch (DataNotFoundException $dnfe) {
    ... do stuff ...
} catch (OtherException $oe) {
    ... do other stuff ...
}

我的问题是,拥有大量微小的异常类和只抛出异常实例之间的平衡点在哪里。有人对何时引入新的异常类有任何指导吗?

【问题讨论】:

  • 如果您确切知道抛出了哪种异常,您可以控制它输出的错误消息、覆盖现有功能并定义附加功能。

标签: php exception


【解决方案1】:

当您有不同的逻辑来处理异常时,您必须始终扩展 Exception 类。找php Spl库,顺便说一下里面包含了一些异常类,所以不需要自己定义。

【讨论】:

  • 你的意思是不同的逻辑,就像我的问题代码中的两个 catch 子句一样?
  • 啊,SPL 很方便 - 有一些标准异常可供选择!
【解决方案2】:

包含大量特定异常并不是一个坏习惯,但只包含相关且可重现的异常。如果您选择对它们进行非常具体的处理,那么它也应该按照特定的顺序进行;从非常具体到一般。

try {}    catch (CryptographicException e)
{ ...doSomething }

catch (ArgumentOutOfBoundsException e)
{ ...doSomething }

catch (Exception e)
{ ...doSomething }

这归因于对事件的处理,如果首先出现一般异常,则将跳过所有其他异常。在一般例外之前有特定例外将有助于您从他们那里获得更多信息。

【讨论】:

  • 谢谢,这正是我想知道的。我只是担心我可能会被 Exception 类弄得有点泛滥,但是您的“相关且可重现”的测试是一种很好的思考方式。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多