【问题标题】:Why use multiple PHP Exception classes为什么要使用多个 PHP 异常类
【发布时间】:2012-01-09 01:36:27
【问题描述】:

我承认我并没有大量使用异常,而且它们有时让我难以 100% 掌握 PHP,这可能部分是因为 PHP 没有最好的错误 => 异常支持,但我还是这样做了对他们了解不多。

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

我认为有充分的理由?

class OptimizeImageException extends Exception {};

class FileNotFoundException extends OptimizeImageException {};

class FileNotImageException extends OptimizeImageException {};

class ModuleNotFoundException extends OptimizeImageException {};

【问题讨论】:

  • 特异性是我能想到的唯一理由;如果异常有名称,至少当它开始出现时您可能知道从哪里开始。
  • @Jared Farrish:“当它开始出现时”——你有异常跟踪并且知道它被抛出的确切位置,每个案例有或没有特定的类
  • @zerkms - 我不确定你同意还是不同意我的观点?
  • @Jared Farrish:我不同意你的观点:“如果异常有名字,至少当它开始出现时你可能知道从哪里开始”——你总能找到异常的位置来自甚至没有它的名字,因为每个异常都有堆栈跟踪
  • @zerkms - 也许我们将“从哪里开始”解释为不同。你的回答和我的意思差不多。这就是为什么我说“特异性”,这并不意味着“特定于行”(我个人认为这很奇怪)。

标签: php exception-handling


【解决方案1】:

通过拥有多个 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,你只知道出了点问题。你不知道出了什么问题,所以你不能根据不同的场景有不同的恢复响应,而不是不使用另一种机制(这会使异常变得相当弱)。

【讨论】:

    【解决方案2】:

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

    喜欢:

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

    在上面的代码中,您正在处理一种特殊的异常情况,可以在此时此地进行处理,以按预期移动您的应用程序流。其他可能的例外情况会更上一层楼。

    如果您只有一个像MyAppException 这样的异常类,那么您所能做的就是捕获它,检查消息(这很奇怪)以了解实际发生的情况,如果您无法处理它 - 重新抛出异常。正如您所看到的那样,您的代码会有点骇人听闻且无法维护(您无法更改异常消息)

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2011-12-02
      • 2019-11-12
      • 2015-08-16
      • 1970-01-01
      • 2019-01-10
      • 2017-04-01
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多