Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Исключительные ситуации


Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

PHP 5: Новые возможности.

PHP 5, подобно многим современным языкам программирования, поддерживает обработку исключительных ситуаций (exceptions) в рамках популярной парадигмы try/catch/throw.

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

ReflectionClass::export('Exception');
Class [ <internal> class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [6] {
    Property [ <default> protected $message ]
    Property [ <default> private $string ]
    Property [ <default> protected $code ]
    Property [ <default> protected $file ]
    Property [ <default> protected $line ]
    Property [ <default> private $trace ]
  }

  - Methods [9] {
    Method [ <internal> final private method __clone ] {
    }

    Method [ <internal, ctor> public method __construct ] {

      - Parameters [2] {
        Parameter #0 [ <required> $message ]
        Parameter #1 [ <required> $code ]
      }
    }

    Method [ <internal> final public method getMessage ] {
    }

    Method [ <internal> final public method getCode ] {
    }

    Method [ <internal> final public method getFile ] {
    }

    Method [ <internal> final public method getLine ] {
    }

    Method [ <internal> final public method getTrace ] {
    }

    Method [ <internal> final public method getTraceAsString ] {
    }

    Method [ <internal> public method __toString ] {
    }
  }
}
        

Исключительную ситуацию, прежде чем она подвергнется обработке, следует создать (throw[1]).

throw new Exception;
Fatal error:  Uncaught exception 'Exception'
throw new Exception('Oops!');
Fatal error:  Uncaught exception 'Exception' with message 'Oops!'

К сожалению, большинство встроенных функций не генерируют исключительные ситуации с целью обеспечения обратной совместимости с PHP 4. Это ограничивает возможность использования обработки исключительных ситуаций во многих случаях, где она традиционно применяется: при открытии файлов, работе с базами данных, установкой удаленных соединений и т. п. Впрочем, некоторые новые расширения, появившиеся в пятой версии, все же генерируют исключительные ситуации (например, функции PDO).

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

Структура try...catch несколько напоминает традиционные контрольные структуры ветвления. Блок try содержит программный код, во время выполнения которого может возникнуть исключительная ситуация. Ему должнен сопутствовать, как минимум, один блок catch (на их может быть и несколько для перехвата различных типов исключительных ситуаций). Каждый такой блок принимает в качестве аргумента объект класса Exception (или унаследованного от него), причем, класс аргумента следует указывать явно (подсказка типа - type hinting). Если исключительная ситуация в блоке try будет сгенерирована, то дальнейшее исполнение кода в этом блоке прерывается. Управление передается в первый блок catch, тип объекта в котором совпадает с типом сгенерированного исключения (даже если совпадение будет обнаружено в нескольких блоках, то исполнен будет только первый из них). Если совпадение не будет обнаружено ни в одном из блоков catch, будет предпринята попытка найти вышестоящую структуру try...catch, включающую в себя данную структуру, в рамках текущей функции. Если и эта попытка окажется безуспешной, поиск продолжится в функции, вызвавшей ту, в которой случилась исключительная ситуация. Если же исключительную ситуацию так и не удастся перехватить, будет сгенерирована фатальная ошибка.

<?php

try {
    print 'It is Ok.';
    throw new Exception('Oops!');
    print 'It is wrong!';
} catch (Exception $e) {
    echo 'Caught exception: ', $e->getMessage();
}

?>
        
It is Ok.
Caught exception: Oops!
        

Использование механизма исключительных ситуаций значительно облегчает разработку приложений, так как в потенциально богатых ошибками участках кода (например, при установлении соединения с удаленным сервером и последующем обмене данными) вместо множества проверок if...else в каждом месте, где возможна ошибка, применим один блок try, в рамках которого при необходимости будет сгенерирована та или иная ошибка, которая, в зависимости от типа, будет обработана в соответствующем блоке catch.

Другое важное преимущество - возможность продолжения исполнения скрипта после соответствующей обработки возникшей исключительной ситуации (устранения последствий ошибки).

  • При наследовании встроенного класса Exception следует из конструктора класса-наследника вызывать конструктор родительского класса (parent::__construct()). Также может быть перекрыт метод __toString.
  • Исключительные ситуации следует использовать только для обработки возникающих проблем...
  • ...и не следует использовать в качестве обычной контрольной структуры для управления исполняемым потоком команд.
  • Исключения должны содержать только информацию об ошибочной ситуации.
  • Порядок исполнения команд внутри обрабатывающего блока catch не должен зависеть от информации, содержащейся в обрабатываемом исключении.

Created with DocBook Created with Libxslt



[1] Бросать, выбрасывать, извергать.


В избранное