Зачем использовать несколько классов PHP Exception - PullRequest
4 голосов
/ 09 января 2012

Я признаю, что не часто использую исключения, и мне трудно понять 100% в PHP, это может быть отчасти потому, что в PHP нет лучшей ошибки => Поддержка исключений, но тем не менее я делаюне знаю много о них.

Возьмем, к примеру, приведенный ниже код, в нем определены 4 различных класса, которые ничего не делают, кроме расширения базового класса исключений.Мне просто любопытно, почему нельзя просто назвать Исключение и почему у них есть все эти отдельные классы.

Я полагаю, что есть веская причина?

class OptimizeImageException extends Exception {};

class FileNotFoundException extends OptimizeImageException {};

class FileNotImageException extends OptimizeImageException {};

class ModuleNotFoundException extends OptimizeImageException {};

Ответы [ 2 ]

6 голосов
/ 09 января 2012

Имея несколько классов исключений, вы можете выбрать тот, который вас интересует, при их отлове.

<?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 голосов
/ 09 января 2012

Вам нужно иметь разные классы исключений, чтобы иметь возможность выяснить, что на самом деле произошло в случае обработки какого-либо конкретного исключения.

Как:

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

В приведенном выше коде вы обрабатываете один конкретный случай исключения, который можно обработать прямо здесь и сейчас, чтобы переместить поток приложения, как ожидалось.Другие возможные исключения будут идти выше.

Если у вас был только один класс исключений, такой как MyAppException, тогда все, что вы могли бы сделать, это просто перехватить его, проверить сообщение (что странно), чтобы понять, что на самом деле произошло, и если выне может справиться с этим - отбросить исключение.Как вы можете видеть, ваш код будет немного хакерским и неприемлемым (вы не можете изменить сообщение об исключении)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...