Пример PHP Try Catch: руководство по обработке исключений и ошибок
Что такое исключение?
Ошибка — это неожиданный результат программы, который не может быть обработан самой программой.
Ошибки устраняются исправлением программы. Примером ошибки может быть бесконечный цикл, который никогда не прекращает выполнение.
Исключением является неожиданный результат программы, который может быть обработан самой программой.
Примеры исключений включают попытку открыть несуществующий файл.
Это исключение можно обработать, создав файл или предоставив пользователю возможность поиска файла.
Зачем обрабатывать исключение?
- Избегайте неожиданных результатов на наших страницах, которые могут сильно раздражать или раздражать наших конечных пользователей.
- Повысьте безопасность наших приложений, не раскрывая информацию, которую злоумышленники могут использовать для атаки на наши приложения.
- Исключения Php используются для изменения нормального хода программы в случае возникновения какой-либо предсказуемой ошибки.
Обработка ошибок PHP
При возникновении ошибки, в зависимости от настроек конфигурации, PHP отображает сообщение об ошибке в веб-браузере с информацией о произошедшей ошибке.
PHP предлагает несколько способов обработки ошибок.
Мы рассмотрим три (3) часто используемых метода;
- Заявления о смерти– функция die объединяет функцию эха и выхода в одну. Это очень полезно, когда мы хотим вывести сообщение и остановить выполнение скрипта при возникновении ошибки.
- Пользовательские обработчики ошибок – это определяемые пользователем функции, которые вызываются при возникновении ошибки.
- Отчеты об ошибках PHP – сообщение об ошибке в зависимости от настроек отчетов об ошибках PHP. Этот метод очень полезен в среде разработки, когда вы не знаете, что вызвало ошибку. Отображаемая информация может помочь вам отладить ваше приложение.
Примеры обработки ошибок
Давайте теперь рассмотрим несколько простых примеров с процедурами обработки ошибок.
Предположим, мы разработали приложение, которое использует текстовые файлы для хранения данных. Возможно, нам захочется проверить существование файла, прежде чем пытаться прочитать из него данные.
Код ниже реализует приведенный выше пример.
<?php $denominator = 0; echo 2 / $denominator; ?>
Предполагая, что вы сохранили файл simple_error.php в папке phptuts, откройте URL-адрес. http://localhost/phptuts/simple_error.php
Вы получите следующие результаты
Как видно из приведенных выше результатов, наше приложение выглядит непрофессионально и может раздражать пользователя.
Мы изменим приведенный выше код и напишем обработчик ошибок для приложения.
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Предполагая, что вы сохранили приведенный выше код как error_handling.php, откройте URL-адрес. http://localhost/phptuts/error_handling.php
Примечание: Хорошей практикой безопасности является отображение сообщения, показанного выше, вместо отображения сообщения типа «Файл не найден».
Давайте рассмотрим другой пример, в котором используется собственный обработчик ошибок.
Пользовательский обработчик ошибок будет установлен в качестве функции обработки ошибок PHP по умолчанию и будет отображать номер ошибки и сообщение.
Код ниже иллюстрирует реализацию приведенного выше примера.
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Откройте URL http://localhost/phptuts/custom_error_handler.php вы получите следующие результаты
Как вы можете видеть из приведенного выше примера, пользовательские обработчики ошибок являются мощными в том смысле, что
- Они позволяют нам настраивать сообщения об ошибках.
- Пользовательский обработчик ошибок также может включать регистрацию ошибок в файле/базе данных, отправку сообщений разработчику по электронной почте и т. д.
Давайте теперь посмотрим на третий тип обработки ошибок. Мы будем использовать встроенную в PHP функцию error_reporting. Он имеет следующий базовый синтаксис
<?php error_reporting($reporting_level); ?>
ВОТ,
- «error_reporting» — функция сообщения об ошибках PHP.
- «$reporting_level» не является обязательным, его можно использовать для установки уровня отчетности. Если уровень отчетности не указан, PHP будет использовать уровень отчетности об ошибках по умолчанию, указанный в файле php.ini.
Уровень отчетности | Описание | Пример |
---|---|---|
E_WARNING | Отображает только предупреждающие сообщения. Не останавливает выполнение скрипта | error_reporting (E_WARNING); |
E_NOTICE | Отображает уведомления, которые могут возникнуть во время нормального выполнения программы или могут быть ошибками. | error_reporting (E_ NOTICE); |
E_USER_ERROR | Отображает ошибки, сгенерированные пользователем, т.е. собственный обработчик ошибок. | error_reporting (E_ USER_ERROR); |
E_USER_WARNING | Отображает созданные пользователем предупреждающие сообщения | error_reporting (E_USER_WARNING); |
E_USER_NOTICE | Отображает уведомления, созданные пользователем | error_reporting (E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Отображает ошибки, которые не являются фатальными и могут быть обработаны с помощью специальных обработчиков ошибок. | error_reporting (E_RECOVERABLE_ERROR); |
E_ALL | Отображает все ошибки и предупреждения | error_reporting (E_ ВСЕ); |
Разница между ошибками и исключениями
- Исключения создаются и предназначены для перехвата, тогда как ошибки, как правило, необратимы.
- Исключения обрабатываются объектно-ориентированным способом. Это означает, что исключение генерируется; создается объект исключения, содержащий сведения об исключении.
В таблице ниже показаны методы объекта исключения.
Способ доставки | Описание | Пример |
---|---|---|
GetMessage () | Отображает сообщение об исключении |
<?php echo $e->getMessage(); ?> |
получить код() | Отображает числовой код, обозначающий исключение. |
<?php echo $e->getCode(); ?> |
получить файл() | Отображает имя файла и путь, где произошло исключение. |
<?php echo $e->getFile(); ?> |
getLine () | Отображает номер строки, в которой произошло исключение |
<?php echo $e->getLine(); ?> |
getTrace() | Отображает массив трассировки перед исключением. |
<?php print_r( $e->getTrace()); ?> |
getPrevious () | Отображает предыдущее исключение перед текущим |
<?php echo $e->getPrevious(); ?> |
получитьTraceAsString() | Отображает обратную трассировку исключения в виде строки, а не массива. |
<?php echo $e->getTraceAsString(); ?> |
__нанизывать() | Отображает все исключение в виде строки |
<?php echo $e->__toString(); ?> |
Ниже приведен основной синтаксис для создания исключения.
<?php throw new Exception("This is an exception example"); ?>
ВОТ,
- «throw» — ключевое слово, используемое для создания исключения
- «new Exception(…)» создает объект исключения и передает строку «Это пример исключения» в качестве параметра сообщения.
Приведенный выше код выводит следующее сообщение.
Теперь мы рассмотрим пример, реализующий исключения throw и catch.
Мы изменим приведенный выше пример и включим в него методы try, throw и catch.
Он имеет следующий базовый синтаксис.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
ВОТ,
- «try{…}» — это выполняемый блок кода, который потенциально может вызвать исключение.
- «catch(Exception $e){…}» — это блок кода, который перехватывает выброшенное исключение и присваивает объект исключения переменной $e.
В приведенном ниже коде показан базовый пример исключения с реализованными исключениями try, throw и catch.
Программа намеренно генерирует исключение, которое затем перехватывает.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Откройте URL http://localhost/phptuts/exception_handling.php Вы получите следующие результаты.
Также возможно создать несколько исключений для одного оператора PHP try в зависимости от типа создаваемого исключения.
Смотрите статью на MySQL, доступ к данным PHP… для примеров реализации нескольких исключений
Множественные исключения
Множественные исключения используют несколько блоков try catch для обработки выброшенных исключений. Множественные исключения полезны, когда;
- Вы хотите отображать индивидуальное сообщение в зависимости от возникшего исключения.
- Вы хотите выполнить уникальную операцию в зависимости от возникшего исключения.
На приведенной ниже блок-схеме показано, как работают множественные исключения.
Давайте рассмотрим пример, в котором используется несколько исключений.
Мы изменим код, который делит число на переданный знаменатель.
Мы ожидаем возникновения двух типов исключений;
- Деление на ноль
- Деление на отрицательное число
Для простоты мы будем отображать только тип исключения в наших блоках catch.
PHP, встроенный в класс Exception, используется для генерации исключений.
Мы создадим два класса, расширяющие класс исключений, и будем использовать их для генерации исключений.
Код ниже демонстрирует реализацию.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Тестирование кода
Предположим, вы сохранили Multiple_Exceptions.php в папке phptuts.
Перейдите по URL-адресу http://localhost/phptuts/multiple_exceptions.php
Вернитесь к файлу PHP и передайте -1 в качестве параметра, как показано на следующей диаграмме.
Перейдите по URL-адресу http://localhost/phptuts/multiple_exceptions.php.
Какие результаты вы получаете? Передайте 3 в качестве параметра.
Какие результаты вы получаете?
Резюме
- Ошибки — это неожиданные результаты, полученные PHP-кодом.
- Обработка ошибок повышает производительность приложения.
- PHP имеет встроенные функции, которые можно использовать для настройки способа сообщения PHP об ошибках.
- Исключения подобны ошибкам, но при их возникновении их можно перехватить с помощью блока catch.
- Отображение сообщений об ошибках, содержащих информацию об ошибках, считается плохой практикой безопасности.