异常类应该有多具体?

Pet*_*all 5 php exception

作为一项规则,我尽量避免抛出 Exception 的实例,因为这并没有传达关于发生了什么问题的太多信息。

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

class DataNotFoundException extends Exception {
   // just a tagging class
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

pla*_*t1K 1

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

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

catch (ArgumentOutOfBoundsException e)
{ ...doSomething }

catch (Exception e)
{ ...doSomething }
Run Code Online (Sandbox Code Playgroud)

这归因于事件的处理,如果第一个异常是一般异常,则将跳过所有其他异常。在一般例外之前先列出特定例外也有助于您从例外中获取更多信息。