Лучшее руководство по Обработка исключений PHP в 2024 году. В этом руководстве вы можете изучить Что такое ненормальное,Основное исключение использования,Попробуйте, бросать и ловить,Примеры объяснить:,Создание пользовательского класса исключений,Примеры объяснить:,Несколько исключений,Примеры объяснить:,Rethrows,Примеры объяснить:,Верхнего уровня набор обработчика исключений,правило исключения,
Исключение для изменения ошибка сценария происходит, когда заданный нормальный поток.
PHP 5 предлагает новый метод для обработки ошибок объектно-ориентированным.
Обработка исключений используется, когда указанная ошибка (исключение) происходит изменение нормального потока сценария. Это состояние называется исключение.
Когда исключение вызывается, как правило, это происходит:
Мы покажем различные методы обработки ошибок:
Примечание: Исключения следует использовать только в случае ошибки, она не должна быть использована в заданной точке , чтобы перейти в другое место в коде.
Когда возникает исключение, то последующий код не идет, PHP попытается найти соответствующий "поймать" блок.
Если исключение не перехвачено, но не какой-либо с использованием set_exception_handler () для соответствующего лечения, то серьезная ошибка (неустранимая ошибка) происходит, и сообщения "неперехваченное исключение" (неперехваченного исключения) ошибок на выходе.
Давайте попробуем бросить исключение, но не поймать его:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
Код выше получите ошибку, подобную этой:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
Чтобы избежать ошибок, возникающих в приведенном выше примере, нам нужно создать соответствующий код для обработки исключений.
Правильное обращение код исключения должен включать:
Пусть вызвать исключение:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
Приведенный выше код будет получить ошибку вида:
Message: 变量值必须小于等于 1
Приведенный выше код выдает исключение и ловит его:
Однако для того, чтобы следить за "каждый бросок должен соответствовать поймать" принципе, вы можете создать обработчик исключений верхнего уровня для обработки ошибок пропустили.
Создание обработчика исключений очень просто. Мы просто создаем специальный класс, когда исключение происходит в PHP, вы можете вызвать его функции. Класс должен быть расширением класса исключений.
Пользовательский класс исключения наследует все атрибуты, определенные в классе PHP исключений, вы можете добавлять пользовательские функции.
Начните с создания классов исключений:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@exampleru.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Этот новый класс является копией старого класса исключения, плюс функция ErrorMessage (). Потому что это копия старого класса, поэтому он наследует от старых свойств и методов класса, мы можем использовать методы класса исключения, такие как GetLine (), GetFile () и GetMessage ().
Приведенный выше код генерирует исключение, и через пользовательский класс исключений, чтобы захватить его:
Вы можете использовать несколько исключений в качестве сценария для обнаружения различных ситуаций.
Вы можете использовать несколько блоков ifruelse, или блок кода коммутатора или гнезда несколько исключений. Эти исключения могут использовать различные классы исключений и возвращать различные сообщения об ошибках:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@example.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Код выше проверяет два условия, если кто-либо условие не выполнено, то бросить исключение:
Если исключение класса customException выбрасывается, но не поймали customException, захватили только базовое исключение, где исключения ручки.
Иногда, когда возникает исключение, вы можете отличаться от стандартного способа справиться с этим. Может быть снова брошен в блоке "поймать".
Сценарий должен быть скрыт от системных ошибок пользователя. Для программистов, системных ошибок может быть важным, но пользователь не заинтересован в них. Для того, чтобы сделать его более удобным для пользователей, чтобы использовать, вы можете бросить исключение снова с относительно удобной для пользователя сообщения:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "someone@example.com"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
Приведенный выше код обнаружен в адрес электронной почты, если он содержит строку "пример". Если есть, опять же, возникает исключение:
Если исключение не перехвачено в текущем "попробовать" блок, он ищет блок поймать на более высоком уровне.
Функция set_exception_handler () может быть установлен для обработки всех неперехваченное исключение из функций, определяемых пользователем.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
Выход указанного выше кода выглядит следующим образом:
Exception: Uncaught Exception occurred
В приведенном выше коде, нет "поймать" блок, но обработчик исключений верхнего уровня срабатывает. Эта функция должна использоваться, чтобы захватить все неперехваченное исключение.
Короче говоря: если вы бросаете исключение, вы должны поймать его.