Обработка исключений PHP
- Предыдущая страница PHP Error
- Следующая страница PHP Filter
Исключение (Exception) используется для изменения обычного потока выполнения скрипта при возникновении определенного ошибочного случая.
Что такое исключение?
PHP 5 предоставляет новый метод面向对象的 обработки ошибок.
Обработка исключений используется для изменения обычного потока выполнения скрипта при возникновении определенного ошибочного (исключительного) случая. Это состояние называется исключением.
Когда исключение возникает, обычно происходит:
- Текущее состояние кода сохраняется
- Выполнение кода переключается на предопределенный обработчик исключений функции
- В зависимости от ситуации, обработчик может начать выполнять код из сохраненного состояния кода, завершить выполнение скрипта или продолжить выполнение скрипта из другого места кода
Мы покажем различные методы обработки ошибок:
- Основное использование исключений
- Создание пользовательского обработчика исключений
- Множественные исключения
- Переопределение исключения
- Настройка верхнего обработчика исключений
Основное использование исключений
Когда исключение выброшено, следующий код не продолжает выполняться, PHP пытается найти соответствующий блок кода "catch".
Если исключение не было перехвачено и не было использовано set_exception_handler() для соответствующего обработки, то произойдет серьезная ошибка (фатальная ошибка), и будет выведено сообщение об ошибке "Uncaught Exception" (не捕获ленная исключение).
Попытаемся выбросить исключение, не пытаясь его перехватить:
<?php //создать функцию с исключением function checkNum($number) { if($number>1) { throw new Exception("Значение должно быть 1 или меньше"); } return true; } //вызвать исключение checkNum(2); ?>
Этот код получит ошибку,类似的:
Фатальная ошибка: не捕获ленная исключение 'Exception' с сообщением 'Value must be 1 or below' в C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} выброшено в C:\webfolder\test.php на строке 6
Try, throw и catch
Чтобы избежать ошибок, как в приведенном выше примере, нам нужно создать соответствующий код для обработки исключений.
Правильный обработчик должен включать:
- Try - функция, которая может вызывать исключения, должна быть расположена в блоке кода "try". Если исключение не произошло, код будет выполняться как обычно. Однако, если исключение было вызвано, будет выброшено исключение.
- Throw - здесь указывается, как вызывать исключения. Каждому «throw» должно соответствовать по крайней мере одно «catch»
- Catch - блок «catch» будет ловить исключение и создавать объект, содержащий информацию о нем
Давайте вызовем исключение:
<?php //Создается функция, которая может выбрасывать исключение function checkNum($number) { if($number>1) { throw new Exception("Значение должно быть 1 или меньше"); } return true; } //В блоке «try» вызывается исключение try { checkNum(2); //Если выбрасывается исключение, этот текст не будет показан echo 'Если вы видите это, число 1 или меньше'; } //Захват исключения catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
Верхний код получит类似 такую ошибку:
Message: Значение должно быть 1 или меньше
Пример объяснение:
Верхний код выбрасывает исключение и его ловит:
- Создается функция checkNum(). Она проверяет, является ли число больше 1. Если да, то выбрасывается исключение.
- Функция checkNum() вызывается в блоке «try».
- Исключение в функции checkNum() выбрасывается
- Код блока «catch» принимает этот исключение и создает объект, содержащий информацию о нем ($e).
- Через вызов метода $e->getMessage() из этого объекта exception выводится сообщение об ошибке, связанное с этим исключением.
Однако, чтобы следовать принципу «каждому throw должно соответствовать catch», можно настроить верхний обработчик исключений для обработки пропущенных ошибок.
Создание пользовательского класса Exception
Создание пользовательского обработчика исключений очень просто. Мы просто создаем специализированный класс, функции которого можно вызывать при возникновении исключений в PHP. Этот класс должен быть расширением класса exception.
Эта пользовательская класс exception наследует все атрибуты класса exception PHP, к которому можно добавить пользовательские функции.
Мы начинаем создавать класс exception:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() ': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example...com"; try { //проверка if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Этот новый класс является копией старого класса исключений, дополненной функцией errorMessage(). Поскольку это копия старого класса, он наследует атрибуты и методы старого класса, и мы можем использовать методы класса исключений, такие как getLine(), getFile() и getMessage().
Пример объяснение:
Upper code throws an exception and catches it with a custom exception class:
- Класс customException создается как расширение старого класса exception. Таким образом, он наследует все свойства и методы старого класса.
- Создать функцию errorMessage(). Если адрес e-mail является недействительным, функция возвращает сообщение об ошибке
- Установить переменную $email в строку e-mail, которая является недействительной
- Выполнение блока кода "try", из-за того, что адрес e-mail является недействительным, исключение будет выброшено
- Блок кода "catch" перехватывает исключение и отображает сообщение об ошибке
Множественные исключения
Для одного скрипта можно использовать несколько исключений для проверки различных ситуаций.
Можна использовать несколько блоков кода if..else или один блок кода switch, или вложенные несколько исключений. Эти исключения могут использовать различные классы исключений и возвращать различные сообщения об ошибках:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() ': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example.com"; try { //проверка if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Пример объяснение:
Upper code tests two conditions, if any condition is not met, then an exception is thrown:
- Класс customException создается как расширение старого класса exception. Таким образом, он наследует все свойства и методы старого класса.
- Создать функцию errorMessage(). Если адрес электронной почты недействителен, функция возвращает сообщение об ошибке.
- Выполнение блока кода "try", при первом условии исключение не будет выброшено.
- Из-за того, что e-mail содержит строку "example", второе условие вызовет исключение.
- Блок кода "catch" перехватывает исключение и отображает соответствующее сообщение об ошибке
Если не было перехвата customException, а только base exception, то обработка исключения производится там.
Переопределение исключения
Иногда, когда возникает исключение, возможно, вы хотите обрабатывать его нестандартным образом. Вы можете заново выбросить исключение в блоке кода "catch".
Скрипт должен скрывать системные ошибки от пользователей. Для программистов системные ошибки могут быть важны, но пользователи к ним не интересуются. Чтобы сделать использование проще, можно заново выбросить исключение с более дружествительным сообщением для пользователей:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Пример объяснение:
Верхний код проверяет, содержит ли адрес электронной почты строку "example". Если да, заново выбрасывает исключение:
- Класс customException создается как расширение старого класса exception. Таким образом, он наследует все свойства и методы старого класса.
- Создать функцию errorMessage(). Если адрес электронной почты недействителен, функция возвращает сообщение об ошибке.
- Установить переменную $email в качестве действительного адреса электронной почты, но с содержанием строки "example".
- Блок кода "try" содержит еще один блок "try", чтобы заново выбросить исключение.
- Исключение сработало из-за того, что e-mail содержит строку "example".
- "catch" уловил это исключение и заново выбросил "customException".
- Уловлено "customException" и отображено сообщение об ошибке.
Если исключительная ситуация не была перехвачена в текущем блоке try, то она будет искать блок catch на более высоком уровне.
Настройка верхнего уровня обработчика исключительных ситуаций (Top Level Exception Handler)
Функция set_exception_handler() может определить пользовательскую функцию для обработки всех не捕获енных исключительных ситуаций.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Не перехваченная исключительная ситуация'); ?>
Вывод приведенного выше кода должен быть подобен этому:
Exception: Не перехваченная исключительная ситуация
В приведенном выше коде отсутствует блок catch, и вместо этого срабатывает верхний уровень обработки исключительных ситуаций. Должен быть использован этот функционал для перехвата всех не捕获енных исключительных ситуаций.
Правила исключительных ситуаций
- Код, который необходимо обработать с помощью исключительных ситуаций, должен быть помещен в блок try, чтобы перехватывать потенциальные исключительные ситуации.
- Каждый блок try или throw должен иметь по крайней мере один соответствующий блок catch.
- Использование нескольких блоков catch позволяет перехватывать различные типы исключительных ситуаций.
- Исключительная ситуация может быть заново выброшена в блоке catch, находящемся в блоке try.
Коротко говоря: если выброшена исключительная ситуация, её необходимо перехватить.
- Предыдущая страница PHP Error
- Следующая страница PHP Filter