Исключения используются для изменения нормального хода выполнения сценария при возникновении указанной ошибки.
PHP 5 предоставляет новый объектно-ориентированный подход к обработке ошибок.
Обработка исключений используется для изменения нормального хода выполнения сценария при возникновении заданной ошибки (исключения). Такая ситуация называется исключением.
Когда срабатывает исключение, это обычно происходит:
Текущее состояние кода сохраняется.
Выполнение кода переключается на предопределенную (настраиваемую) функцию обработчика исключений.
В зависимости от ситуации процессор может перезапустить выполнение кода из сохраненного состояния кода, прекратить выполнение сценария или продолжить выполнение сценария из другого места кода.
Мы покажем различные методы обработки ошибок:
Базовое использование исключений
Создайте собственный обработчик исключений
Множественные исключения
повторно выдать исключение
Установить обработчик исключений верхнего уровня
Примечание. Исключения следует использовать только в случае ошибок и не следует использовать для перехода к другому месту кода в указанной точке.
При возникновении исключения следующий код не будет продолжать выполняться, и PHP попытается найти соответствующий блок кода.
Если исключение не перехвачено и не обработано соответствующим образом с помощью set_Exception_handler(), произойдет серьезная ошибка (фатальная ошибка) и будет выведено сообщение об ошибке «Неперехваченное исключение».
Давайте попробуем сгенерировать исключение, не перехватывая его:
<?php // Создаем функцию с обработкой исключений функция checkNum ( $номер ) { если ( $number > 1 ) { бросать новый Исключение ( « Значение должно быть 1 или меньше » ) ; возвращаться истинный ; } // вызвать исключение проверитьНомер ( 2 ) ? >
В приведенном выше коде возникнет ошибка, подобная этой:
Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «Значение должно быть 1 или ниже» в /www/codercto/test/test.php:7 Трассировка стека: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} добавлен в /www/codercto/test/test.php в строке 7.
Чтобы избежать ошибки, показанной в приведенном выше примере, нам необходимо создать соответствующий код для обработки исключений.
Правильный код обработки исключений должен включать в себя:
Try — функции, использующие исключения, должны находиться внутри блока «try». Если исключение не срабатывает, код продолжает выполнение в обычном режиме. Но если сработает исключение, оно будет создано.
Throw — указывает, как вызвать исключение. Каждому «броску» должен соответствовать хотя бы один «лов».
Catch — блок «catch» перехватывает исключение и создает объект, содержащий информацию об исключении.
Давайте вызовем исключение:
<?php // Создаем функцию с обработкой исключений функция checkNum ( $номер ) { если ( $number > 1 ) { бросать новый Exception ( " Значение переменной должно быть меньше или равно 1 " ) ; возвращаться истинный ; } // Вызов исключения в блоке try пытаться { checkNum ( 2 ) // Если возникнет исключение, следующий текст не будет выведен эхо ' Если это содержимое выводится, объясните переменную $number ' } // перехватываем исключение поймать ( Исключение $ е ) { эхо ' Сообщение: ' . $e -> getMessage ( ) } ; ?>
В приведенном выше коде возникнет ошибка, подобная этой:
Сообщение: Значение переменной должно быть меньше или равно 1.
Приведенный выше код генерирует исключение и перехватывает его:
Создайте функцию checkNum(). Он определяет, превышает ли число 1. Если да, создайте исключение.
Вызовите функцию checkNum() в блоке «try».
Выдается исключение в функции checkNum().
Блок кода «catch» получает исключение и создает объект ($e), содержащий информацию об исключении.
Выведите сообщение об ошибке из этого исключения, вызвав $e->getMessage() из этого объекта исключения.
Однако, чтобы следовать принципу «каждый вызов должен соответствовать перехвату», вы можете настроить обработчик исключений верхнего уровня для обработки пропущенных ошибок.
Создать собственные обработчики исключений очень просто. Мы просто создали специализированный класс, функции которого можно вызывать при возникновении исключения в PHP. Этот класс должен быть расширением класса исключений.
Этот пользовательский класс customException наследует все свойства класса исключений PHP, и вы можете добавлять к нему собственные функции.
Начнем с создания класса customException:
<?php сорт customException простирается Исключение { общественный функция сообщение об ошибке ( ) { // сообщение об ошибке $ errorMsg = ' Номер строки ошибки ' . $ this - > getLine ( ) . Действительный адрес электронной почты ' ; $ ошибкаMsg } } $email = " кто - то@example...com " ; { // Обнаружение электронной почты if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // Если это незаконный адрес электронной почты, выдаем исключение бросать новый customException ( $email ) } ; } ловить ( customException $ е ) { // отображаем пользовательское сообщение эхо $e -> errorMessage ( ) } ; ?>
Этот новый класс является копией старого класса исключений плюс функция errorMessage(). Просто потому, что это копия старого класса, он наследует свойства и методы старого класса, и мы можем использовать методы класса исключений, такие как getLine(), getFile() и getMessage().
Приведенный выше код генерирует исключение и перехватывает его через специальный класс исключений:
Класс customException() был создан как расширение старого класса исключений. Таким образом, он наследует все свойства и методы старого класса исключений.
Создайте функцию errorMessage(). Если адрес электронной почты недействителен, эта функция возвращает сообщение об ошибке.
Задайте для переменной $email недопустимую строку адреса электронной почты.
Блок кода «try» выполняется и выдается исключение, поскольку адрес электронной почты недействителен.
Блок кода «catch» перехватывает исключение и отображает сообщение об ошибке.
Вы можете использовать несколько исключений для сценария, чтобы обнаружить несколько ситуаций.
Вы можете использовать несколько блоков кода if..else, блок кода переключателя или вложить несколько исключений. Эти исключения могут использовать разные классы исключений и возвращать разные сообщения об ошибках:
<?php сорт customException простирается Исключение { общественный функция сообщение об ошибке ( ) { // сообщение об ошибке $ errorMsg = ' Номер строки ошибки ' . $ this - > getLine ( ) . Действительный адрес электронной почты ' ; $ ошибкаMsg } } $ email = " кто-то@example.com " ; { // Обнаружение электронной почты if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // Если это незаконный адрес электронной почты, выдаем исключение бросать новый customException ( $email ) } ; // Проверяем, есть ли «пример» в адресе электронной почты if ( strpos ( $email , " пример " ) !== FALSE ) { бросать новый Exception ( " $email — пример почтового ящика " ) ; } ловить ( customException $ е ) { эхо $e -> errorMessage ( ) } ; поймать ( Исключение $ е ) { эхо $e -> getMessage ( ) } ; ?>
Приведенный выше код проверяет два условия и выдает исключение, если какое-либо из условий неверно:
Класс customException() был создан как расширение старого класса исключений. Таким образом, он наследует все свойства и методы старого класса исключений.
Создайте функцию errorMessage(). Если адрес электронной почты недействителен, эта функция возвращает сообщение об ошибке.
Задайте для переменной $email строку, которая является действительным адресом электронной почты, но содержит строку «example».
Выполните блок кода «try», и в первом условии исключение не будет выдано.
Поскольку электронное письмо содержит строку «пример», второе условие вызовет исключение.
Блок «catch» перехватывает исключение и отображает соответствующее сообщение об ошибке.
Если класс customException выдает исключение, но customException не перехватывается, перехватывается только базовое исключение, оно обрабатывается там.
Иногда при возникновении исключения вам может потребоваться обработать его иначе, чем стандартно. Исключение может быть выброшено снова в блоке «catch».
Скрипт должен скрывать от пользователя системные ошибки. Системные ошибки могут быть важны для программистов, но пользователей они не интересуют. Чтобы упростить задачу пользователям, вы можете снова создать исключение с понятным для пользователя сообщением:
<?php сорт customException простирается Исключение { общественный функция сообщение об ошибке ( ) { // сообщение об ошибке $errorMsg = $this -> getMessage ( ) ' Недействительный адрес электронной почты . ' ; возвращаться $ ошибкаMsg } } $ email = " кто-то@example.com " ; { пытаться { // Проверяем, есть ли «пример» в адресе электронной почты if ( strpos ( $email , " пример " ) !== FALSE ) { // Если это незаконный адрес электронной почты, выдаем исключение бросать новый Исключение ( $email ) } ; } поймать ( Исключение $ е ) { // Повторно вызываем исключение бросать новый customException ( $email ) } ; } ловить ( customException $ е ) { // Отображение пользовательской информации эхо $e -> errorMessage ( ) } ; ?>
Приведенный выше код определяет, содержится ли в адресе электронной почты строка «пример». Если да, создайте исключение еще раз:
Класс customException() был создан как расширение старого класса исключений. Таким образом, он наследует все свойства и методы старого класса исключений.
Создайте функцию errorMessage(). Если адрес электронной почты недействителен, эта функция возвращает сообщение об ошибке.
Задайте для переменной $email строку, которая является действительным адресом электронной почты, но содержит строку «example».
Блок «try» содержит еще один блок «try», чтобы исключение можно было сгенерировать еще раз.
Поскольку электронное письмо содержит строку «пример», срабатывает исключение.
Блок кода «catch» перехватывает исключение и повторно генерирует «customException».
«customException» перехватывается и отображается сообщение об ошибке.
Если исключение не перехвачено в текущем блоке try, оно будет искать блок catch на более высоком уровне.
Функция set_Exception_handler() устанавливает пользовательскую функцию, которая обрабатывает все неперехваченные исключения.
<?php функция моеИсключение ( $исключение ) { эхо " <b>Исключение:</b> " , $Exception -> getMessage ( ) } ; set_Exception_handler ( ' myException ' ) ; новый Исключение ( ' Произошло неперехваченное исключение ' ) ?> ;
Вывод приведенного выше кода выглядит следующим образом:
Исключение: произошло неперехваченное исключение.
В приведенном выше коде нет блока «catch», вместо этого запускается обработчик исключений верхнего уровня. Эту функцию следует использовать для перехвата всех неперехваченных исключений.
Код, требующий обработки исключений, следует помещать в блок try, чтобы перехватывать потенциальные исключения.
Каждый блок try или throw должен иметь хотя бы один соответствующий блок catch.
Используйте несколько блоков catch для перехвата различных типов исключений.
Исключения могут быть выброшены (повторно созданы) в блоке catch внутри блока try.
Короче говоря: если генерируется исключение, вы должны его перехватить.