为什么要使用多个PHP Exception类


Why use multiple PHP Exception classes

我承认我不经常使用Exceptions,而且我很难在PHP中100%掌握它们,这可能部分是因为PHP没有最好的错误=>Exceptions支持,但我对它们了解不多。

以下面的代码为例,它定义了4个不同的类,它们除了扩展一个基类Exception之外什么都不做。我只是好奇为什么不直接调用Exception,为什么它们有所有这些单独的类。

我想有充分的理由吗?

class OptimizeImageException extends Exception {};
class FileNotFoundException extends OptimizeImageException {};
class FileNotImageException extends OptimizeImageException {};
class ModuleNotFoundException extends OptimizeImageException {};

通过拥有多个Exception类,您可以在捕获它们时选择感兴趣的类。

<?php                                                                       
class OptimizeImageException extends Exception {};
class FileNotFoundException extends OptimizeImageException {};
class FileNotImageException extends OptimizeImageException {};
class ModuleNotFoundException extends OptimizeImageException {};
try {
  throw new FileNotImageException();
} catch (FileNotFoundException $x) {
  echo "NOT FOUND!";
  // do something about it
} catch (FileNotImageException $x) {
  echo "NOT IMAGE!";
  // do something about it
} catch (Exception $x) {
  echo "UNKNOWN EXCEPTION!";
  // do something else about it
}

这是一个微不足道的例子,但假设您有一个函数loadImage(),它应该加载一个图像。如果功能失败,您可以以不同的方式处理不同的失败场景。如果你总是抛出一个基本的Exception,你只知道出了问题。你不知道出了什么问题,所以你不能根据不同的场景有不同的恢复响应,而不是不使用另一种机制(这会使异常变得相当弱)。

您需要有不同的异常类,以便能够找出在可以处理某些特定异常的情况下实际发生了什么

类似:

try {
    // do something
} catch (OptimizeImageException $e) {
    // image cannot be optimized. left it as is and log the error message
}

在上面的代码中,您正在处理一个特定的异常情况,可以在此时此地进行处理,以按预期移动应用程序流。其他可能的例外情况将占上风。

如果您只有一个像MyAppException这样的异常类,那么您所能做的就是捕获它,检查消息(这很奇怪)以了解实际发生了什么,如果您无法处理它,则重新抛出异常。正如您通过这种方式看到的那样,您的代码将有点黑客和不可维护(您无法更改异常消息)