PHP Исключения
Индекс материала |
---|
PHP Исключения |
Класс Exception |
Все страницы |
PHP 5 Осчастливил нас механизмом исключений: Exceptions. Эта статья собственно о том, что они такое, что они могут дать разработчику, и как с ними работать.
Создание класса - это всегда работа на абстрактном уровне: создается не конкретная область памяти, а только поведение объектов. Класс выступает инструментом, который, как и язык программирования, может применяться в совершенно разных областях и приложениях.
Обработка нештатных ситуаций, ошибок как в коде, так и ошибок ввода данных может быть различной для разных приложений: где-то достаточно вывести сообщение при помощи функции echo, а где-то сообщение следует оформить в виде НТМL - страницы с дизайном, согласованным с остальными страницами приложения; где-то сообщение об ошибке должно быть помещено в журнал ( В файл или в базу данных).
Предусмотреть заранее формат ошибки невозможно, а его предопределенность будет сужать область применения класса и возможность его повторного использования. Выходом из ситуации является разделение кода класса и кода обработки ошибок, этого можно достигнуть это нам и позволит сделать механизм исключений.
Разработчик класса должен сгенерировать исключение, а пользователь класса может его обработать по своему усмотрению. Разработчики могут проектировать свои собственные исключения, которые являются классами, при этом генерация исключений сводится к передаче объекта исключения из точки возникновения нештатной ситуации в обработчик исключений.
Удобство применения исключительных ситуаций применительно к объектно - ориентированному подходу вовсе не означает, что следует пренебрегать процедурными средствами обработки ошибок. В РНР имеется развитая система отслеживания и контроля за ошибками, и пренебрегать ею не стоит. Для реализации механизма исключений в РНР введены следующие ключевые слова: try (контролировать), throw (генерировать) и catch (обрабатывать).
Замечание:
Вы можете использовать механизм исключений даже если вы программируете в структурном стиле, а не в стиле ООП. Ключевое слово try позволяет выделить в любом месте скрипта так называемый контролируемый блок, за которым следует один или несколько блоков обработки исключений, реализуемых с помощью ключевого слова catch:
try { // Операторы … // Генерация исключений throw new Exception('Какое то сообщение – необязательно'); … // Операторы } catch (Exception $ехр) { // Блок обработки исключительной ситуации }
Обработчик (или обработчики) всегда располагаются после контролируемого оператором try блока кода. Среди операторов контролируемого блока могут быть любые операторы и объявления РНР. Если в блоке try генерируется исключение при помощи ключевого слова throw, то интерпретатор РНР переходит в catch - обработчик. На изображении представлен скрипт, в котором генерируется исключение, там мы делаем проверку деления на 0.
Имейте в виду: Если исключение не порождается, то блок catch не будет выполнен никогда.
В качестве исключения выступает объект класса Exception, который создается при помощи ключевого new непосредственно при вызове оператора throw. Однако объект можно подготовить заранее:
$excp = new Exception(); throw $excp;
При генерации исключения ключевое слово throw принимает объект класса Exception или производного класса.
Класс Exception
Для эффективного использования класса Exception следует познакомиться с его интерфейсом. Ниже представлены свойства класса Exception, объявленные со спецификатором доступа protected, доступ к которым можно получить при помощи методов класса, а также из производных классов.
Класс Exception относится к так называемым предопределенным классам, то есть классам, которые реализованы в РНР - интерпретаторе и не требуют реализации со стороны программиста.
Защищенные свойства класса Exception:
- $this->message - Текстовое сообщение, описывающее исключительную ситуацию.
- $this->code - Числовой код , назначенный данному типу исключительных ситуаций.
- $this->file - Имя файла, в котором произошла исключительная ситуация.
Методы класса Exception
Так как свойства класса Exception, объявлены со спецификатором protected, доступ к ним осуществляется при помощи методов класса, описание которых представлено ниже:
- public function __construct( $message = NULL, $code = 0 )
- Конструктор класса, инициализирующий свойства $message и $code – оба не обязательны.
- final function getMessage()
- Метод возвращает текстовое сообщение, содержащееся в свойстве $this->message
- final function getCode()
- Метод, возвращающий числовой код исключения, хранящегося в свойстве $this->code
- final function getFile()
- Метод возвращает имя файла $this->file в котором произошло исключение.
- final function getLine()
- Метод возвращает номер строки $this->line в которой произошло исключение.
- final function getTrace()
- Метод возвращает стек обработки исключительной ситуации в виде массива.
- final function getTraceAsString()
- Метод возвращает стек обработки исключительной ситуации в виде строки.
- function __toString()
- Перегрузка магического метода __toString() возвращающего строку, когда происходит попытка использовать объект в строковом контексте.
Ниже представлен код который выдаст подробную информацию о произошедшем исключении:
try { $b = rand(0,1); if($b == 0) { // Здесь порождаем исключение throw new Exception( /* сообщение */ 'Первая точка входа', /* кусок кода */ $b ); } else { // Здесь порождаем исключение throw new Exception( /* сообщение */ 'Вторая точка входа', /* кусок кода */ $b ); } } catch(Exception $e) // Здесь ловим исключение { echo 'Исключние: '. $e->getCode().' : '.$e->getMessage().'<br />'; echo 'В файле :'.$e->getFile().'<br />'; echo 'В строке : '.$e->getLine(); }
В зависимости от того какое значение примет $b скипт выведет информацию для первого оператора throw :
Исключение 0 : Первая точка входа
в файле D: \main\oop\08\index.php
в строке 8
либо для второго :
Исключение 1 : Вторая точка входа
в файле D: \main\oop\08\index.php
в строке 14
Таким образом, имея на вооружении данные методы мы всегда можем точно определить, где и почему произошло исключение и обработать его.
Кстати:
Если исключение не ловиться ни одним блоком catch, то в итоге PHP выдаст фатальную ошибку и остановит скрипт, что бы этого избежать нужно, назначить Исключения как обработчик ошибок:
function exception_handler($exception) { echo "Uncaught exception: " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Not Executed\n";
Nissan с пробегом
Большой каталог Nissan с пробегом в автосалоне Фастар Эксперт в Новосибирске.
fastar-expert.ru
Нашем сайте
Записывайтесь на диагностику дизельных двигателей автомобиля на нашем сайте.
fastarich.ru
Добавить комментарий
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.