Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
PHP 5: Новые возможности.
Исключительные ситуации
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
PHP 5, подобно многим современным языкам программирования, поддерживает обработку исключительных ситуаций (exceptions) в рамках популярной парадигмы try/catch/throw.
Класс Exception
Встроенный класс Exception обеспечивает базовую поддержку обработки исключительных ситуаций. При необходимости могут быть определены дополнительные классы, наследующие данному. Познакомиться с переменными и методами класса Exception можно при помощи рефлексии.
Исключительную ситуацию, прежде чем она подвергнется обработке, следует создать (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 несколько напоминает традиционные контрольные структуры ветвления. Блок 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!
Обработчик по умолчанию
PHP 5 позволяет разработчику установить собственный обработчик неперехваченных исключительных ситуаций при помощи функции set_exception_handler(). Сам обработчик должен быть определен до того, как будет вызвана эта функция. Обработчик должен принимать единственный аргумент - перехваченный объект.
<?php
function eHandler ($e) {
echo "Uncaught exception: " , $exception->getMessage();
}
set_exception_handler('eHandler');
throw new Exception('Oops!');
?>
Uncaught exception: Oops!
Преимущества
Использование механизма исключительных ситуаций значительно облегчает разработку приложений, так как в потенциально богатых ошибками участках кода (например, при установлении соединения с удаленным сервером и последующем обмене данными) вместо множества проверок if...else в каждом месте, где возможна ошибка, применим один блок try, в рамках которого при необходимости будет сгенерирована та или иная ошибка, которая, в зависимости
от типа, будет обработана в соответствующем блоке catch.
Другое важное преимущество - возможность продолжения исполнения скрипта после соответствующей обработки возникшей исключительной ситуации (устранения последствий ошибки).
Рекомендации
При наследовании встроенного класса Exception следует из конструктора класса-наследника вызывать конструктор родительского класса (parent::__construct()). Также может быть перекрыт метод __toString.
Исключительные ситуации следует использовать только для обработки возникающих проблем...
...и не следует использовать в качестве обычной контрольной структуры для управления исполняемым потоком команд.
Исключения должны содержать только информацию об ошибочной ситуации.
Порядок исполнения команд внутри обрабатывающего блока catch не должен зависеть от информации, содержащейся в обрабатываемом исключении.