为什么要使用多个PHP Exception类

时间:2012-01-09 01:36:28

标签: php exception-handling

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

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

我认为有充分的理由?

class OptimizeImageException extends Exception {};

class FileNotFoundException extends OptimizeImageException {};

class FileNotImageException extends OptimizeImageException {};

class ModuleNotFoundException extends OptimizeImageException {};

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

如果可以处理某个特定异常,您需要有不同的异常类才能找出实际的内容。

像:

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

在上面的代码中,您正在处理一个特殊的异常情况,可以在此处立即处理,以便按预期移动您的应用程序流。其他可能的例外情况将会更高。

如果你只有一个像MyAppException这样的异常类,那么你只能抓住它,查看消息(这很奇怪)来实现实际发生的事情,如果你不能处理它 - 重新抛出异常。正如你可以看到的那样,你的代码有点hackish和不可维护(你不能改变异常消息)