Приклад PHP Try Catch: Посібник із обробки винятків і помилок
⚡ Розумний підсумок
Обробка помилок та винятків у PHP забезпечує стабільність та безпеку програм, керуючи неочікуваними умовами, а не виявляючи первинні помилки. У цьому посібнику пояснюється порівняння помилок та винятків, оператори die, користувацькі обробники помилок, рівні звітності про помилки та модель винятків try, throw та catch з кількома типами винятків.

Що таке виняток?
Помилка — це неочікуваний результат програми, який не може обробити сама програма.
Помилки усуваються шляхом виправлення програми. Прикладом помилки може бути нескінченний цикл, який ніколи не припиняє виконання.
Виняток – це неочікуваний результат програми, який може бути оброблений самою програмою.
Прикладами винятків є спроба відкрити файл, якого не існує.
Цей виняток можна усунути шляхом створення файлу або надання користувачеві можливості пошуку файлу.
Навіщо обробляти винятки?
- Уникайте неочікуваних результатів на наших сторінках, які можуть бути дуже дратівливими або дратувати наших кінцевих користувачів
- Покращити безпеку наших програм, не розкриваючи інформацію, яку зловмисники можуть використовувати для атаки на наші програми
- Винятки PHP використовуються для зміни нормального ходу програми, якщо виникає будь-яка передбачувана помилка.
Обробка помилок PHP
Коли виникає помилка, залежно від параметрів конфігурації, PHP відображає повідомлення про помилку у веб-браузері з інформацією про помилку, яка сталася.
PHP пропонує кілька способів обробки помилок. Ми розглянемо три поширені методи:
- Заяви Die – функція die поєднує функції echo та exit в одну. Вона дуже корисна, коли ми хочемо вивести повідомлення та зупинити виконання скрипта у разі виникнення помилки.
- Спеціальні обробники помилок – це визначені користувачем функції, які викликаються щоразу, коли виникає помилка.
- Повідомлення про помилки PHP – повідомлення про помилку залежить від ваших налаштувань звітності про помилки 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 "Oops, 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_NOTICES | Відображає повідомлення, які можуть виникнути під час нормального виконання програми або можуть бути помилкою. | звітування_про_помилку(E_NOTICE); |
| E_USER_ERROR | Відображає помилки, згенеровані користувачем, тобто спеціальний обробник помилок | звітування_про_помилку(ПОМИЛКА_КОРИСТУВАЧА_E); |
| 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_ALL); |
Різниця між помилками та винятками
- Винятки викидаються та призначені для перехоплення, тоді як помилки, як правило, невиправні.
- Винятки обробляються об'єктно-орієнтованим способом. Це означає, що коли виникає виняток, створюється об'єкт винятку, який містить деталі винятку.
У таблиці нижче наведено методи об'єктів винятків.
| Метод | Опис | Приклад |
|---|---|---|
| getMessage() | Відображає повідомлення про виняток |
<?php
echo $e->getMessage();
?>
|
| отриматиCode() | Відображає числовий код, який представляє виняток |
<?php
echo $e->getCode();
?>
|
| getFile() | Відображає назву файлу та шлях, де сталася виняток |
<?php
echo $e->getFile();
?>
|
| getLine() | Відображає номер рядка, де сталася виняток |
<?php
echo $e->getLine();
?>
|
| отриматиTracе() | Відображає масив задньої частиниtracе до винятку |
<?php print_r( $e->getTrace()); ?> |
| getPrevious() | Відображає попередній виняток перед поточним |
<?php
echo $e->getPrevious();
?>
|
| отриматиTraceAsString() | Відображає задню частинуtracвинятку як рядок замість масиву |
<?php
echo $e->getTraceAsString();
?>
|
| __toString() | Відображає весь виняток як рядок |
<?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Ви отримаєте такі результати.
Також можна створити кілька винятків для одного оператора try у PHP, залежно від типу винятку, що виникає.
Дивіться статтю на MySQL, Доступ до даних PHP для прикладів реалізації кількох винятків.
Кілька винятків
Кілька винятків використовують кілька блоків catch для обробки викинутих винятків. Кілька винятків корисні, коли:
- Ви хочете відобразити налаштоване повідомлення залежно від створеного винятку
- Ви хочете виконати унікальну операцію залежно від створеного винятку
Блок-схема нижче ілюструє, як працює кілька винятків.
Розглянемо приклад, який використовує кілька винятків. Ми змінимо код, який ділить число на переданий знаменник.
Ми очікуємо виникнення двох типів винятків:
- Поділ на нуль
- Ділення на від'ємне число
Для спрощення ми відображатимемо лише тип винятку в наших блоках catch. Вбудований у PHP клас Exception використовується для генерації винятків. Ми створимо два класи, що розширюють клас 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 як параметр. Які результати ви отримаєте?
Блок finally та модель помилок PHP 7
Сучасний PHP додає два важливі елементи до наведеної вище моделі. Блок finally виконується після try та catch незалежно від того, чи було викинуто виняток, що робить його ідеальним для очищення, такого як закриття файлу або підключення до бази даних.
Починаючи з PHP 7, багато колишніх фатальних помилок викидаються як об'єкти Error. Як Exception, так і Error реалізують інтерфейс Throwable, тому блок catch (\Throwable $e) може обробляти будь-який з них.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
Тут, у PHP 8, ділення на нуль викликає помилку DivisionByZeroError, блок catch повідомляє про це, а блок finally завжди виконується, виводячи своє повідомлення про те, чи сталася помилка, чи ні.








