среда, 18 августа 2010 г.

Памятка по исключениям php 5.3+

Начиная с PHP версии 5.3.0+ прикладному разработчику по умолчанию доступна библиотека SPL (Standart PHP Library), которую теперь даже нельзя отключить опциями компиляции. В связи с этим, можно безопасно пользоваться решениями предоставляемыми этим расширением. В этой заметке я хотел бы осветить набор стандартных исключений, предоставляемых SPL.

Начиная с PHP 5 появилась встроенная поддержка исключений. Для разработчика, Исключение (Исключительная ситуация, Exception) представляется объектом  встроенного класса Exception. Это базовый класс для всех исключений. Вы вправе создавать свои собственные типы исключений, расширяя базовый класс Exception.

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

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

На рисунке приведена диаграмма иерархии доступных исключений.

  • Exception - базовый класс для всех исключений
  • ErrorException - для представления стандартных ошибок PHP (дополняет базовый класс уровнем важности ошибки)
  • LogicException - представляет ошибки в программной логике
  • BadFunctionCallException - для ситуаций, когда указанная функция не может быть вызвана (например функция в этом контексте недоступна, переданы неверные аргументы, либо вообще отсутствует).
  • BadMethodCallException - тоже самое что выше, только для методов.
  • DomainException - для обозначения ситуаций, когда значение не верно, в пределах используемой области.
  • InvalidArgumentException - говорит о неверных переданных аргументах
  • LengthException - для ситауций, когда параметр превышает допустимую величину. Может использоваться для длиных строк, размера массивов, файлов, числа элементов считываемых с помощью итераторов и т.д.
  • OutOfRangeException - для ситауций, когда значение не входит в допустимый диапозон, например запрошен несуществующий индекс. Для ситуаций, когда ошибка может быть определена во времы компиляции.
  • RuntimeException - представляет ошибки, которые могут быть обнаружены только во врремя выполнения
  • OutOfBoundsException для ситуаций, когда запрошен элемент с неверным (недопустимым) ключем. Аналог OutOfRangeException, только для ситуаций, происходящих во время выполнения.
  • OverflowException - для индикации того, что буфер переполнен, например когда добавляется элемент в заполненый контейнер.
  • RangeException - это аналог DomainException, только используется во время выполнения. Показывает что значение не входит в необходимый диапозон.
  • UnderflowException для ситуаций, когда производится попытка удалить элемент из пустого контейнера.
  • UnexpectedValueException - для обозначения ситуаций, когда получается непредвиденное значение. Например функция, вызывает другую функцию и ожидает возвращенное значение определенного типа. 

Особенности PHP 5.3
Все перечисленные исключения принадлежат глобальному пространству имен, что указывается символом обратного слэша, например так:
    if ( ! is_object($user)) {
            throw new \InvalidArgumentException(gettype($user));
    } 
    public function copy()
    {
        throw new \BadMethodCallException("Not implemented.");
    }

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

Полезные ссылки
Обработка исключительных ситуаций в ООП
SPL Exceptions

1 комментарий:

  1. Добавь в ссылки еще http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3

    ОтветитьУдалить