Приклад 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 ви отримаєте такі результати
Як ви можете бачити з наведеного вище прикладу, спеціальні обробники помилок є потужними в тому сенсі, що
- Вони дозволяють нам налаштовувати повідомлення про помилки.
- Спеціальний обробник помилок також може включати реєстрацію помилок у файлі/базі даних, електронний лист розробнику тощо.
Давайте тепер розглянемо третій тип обробки помилок. Ми будемо використовувати функцію error_reporting, вбудовану в PHP. Він має наступний базовий синтаксис
<?php error_reporting($reporting_level); ?>
ТУТ,
- “error_reporting” – це функція звітування про помилки PHP
- «$reporting_level» є необов’язковим, його можна використовувати для встановлення рівня звітності. Якщо рівень звітності не вказано, PHP використовуватиме стандартний рівень звітності про помилки, як зазначено у файлі php.ini.
Рівень звітності | Опис | Приклад |
---|---|---|
E_WARNING | Відображає лише попереджувальні повідомлення. Не зупиняє виконання сценарію | error_reporting(E_WARNING); |
E_NOTICES | Відображає повідомлення, які можуть виникнути під час нормального виконання програми або можуть бути помилкою. | error_reporting(E_ NOTICE); |
E_USER_ERROR | Відображає створені користувачем помилки, тобто спеціальний обробник помилок | повідомлення про помилки (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 | Відображає всі помилки та попередження | повідомлення про помилки (E_ ВСІ); |
Різниця між помилками та винятками
- Винятки створюються та призначені для виявлення, тоді як помилки, як правило, невиправні.
- Винятки обробляються об'єктно-орієнтованим способом. Це означає, що коли виникає виняток; створюється об’єкт винятку, який містить деталі винятку.
У таблиці нижче показано методи об’єктів винятків
Метод | Опис | Приклад |
---|---|---|
getMessage() | Відображає повідомлення про виняток |
<?php echo $e->getMessage(); ?> |
отримати код() | Відображає числовий код, який представляє виняток |
<?php echo $e->getCode(); ?> |
getFile() | Відображає назву файлу та шлях, де сталася виняток |
<?php echo $e->getFile(); ?> |
getLine() | Відображає номер рядка, де сталася виняток |
<?php echo $e->getLine(); ?> |
getTrace() | Відображає масив зворотного трасування перед винятком |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Відображає попередній виняток перед поточним |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Відображає зворотне трасування винятку як рядок замість масиву |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Відображає весь виняток як рядок |
<?php echo $e->__toString(); ?> |
Нижче наведено базовий синтаксис для створення винятку.
<?php throw new Exception("This is an exception example"); ?>
ТУТ,
- "throw" - це ключове слово, яке використовується для створення винятку
- «New Exception(…)» створює об’єкт винятку та передає рядок «Це приклад винятку» як параметр повідомлення.
Наведений вище код виводить таке повідомлення.
Зараз ми розглянемо приклад, який реалізує виключення 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 під час кидання.
- Відображення повідомлень про помилки, які містять інформацію про помилки, вважається поганою практикою безпеки.