Приклад PHP Try Catch: Посібник із обробки винятків і помилок

⚡ Розумний підсумок

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

  • ⚠️ Помилка проти винятку: Помилку, як правило, неможливо виправити, тоді як виняток – це неочікуваний результат, який програма може перехопити та обробити.
  • 🛡️ Навіщо обробляти: Обробка помилок запобігає негарному виводу, захищає користувачів та запобігає витоку інформації, яку можуть використати зловмисники.
  • 🛑 Заяви про померти: Функція die виводить повідомлення та зупиняє скрипт, що є швидким способом зупинити виконання, коли щось не вдається.
  • 🛠️ Користувацькі обробники: set_error_handler() перенаправляє помилки до вашої власної функції, щоб ви могли реєструвати, надсилати електронною поштою або форматувати повідомлення по-своєму.
  • 📢 Повідомлення про помилки: error_reporting() та рівні, такі як E_ALL, контролюють, які попередження та повідомлення показує PHP, що корисно під час розробки.
  • 🧲 Спробуй, кинь, злови: Блок try запускає ризикований код, throw викликає виняток, а catch обробляє його за допомогою методів об'єкта винятків.
  • 🤖 AI Assist: Інструменти штучного інтелекту можуть додавати обробку try-catch до існуючого коду та пояснювати заплутаний стек. tracе або повідомлення про помилку.

Обробка помилок та винятків PHP

Що таке виняток?

Помилка — це неочікуваний результат програми, який не може обробити сама програма.

Помилки усуваються шляхом виправлення програми. Прикладом помилки може бути нескінченний цикл, який ніколи не припиняє виконання.

Виняток – це неочікуваний результат програми, який може бути оброблений самою програмою.

Прикладами винятків є спроба відкрити файл, якого не існує.

Цей виняток можна усунути шляхом створення файлу або надання користувачеві можливості пошуку файлу.

Навіщо обробляти винятки?

  • Уникайте неочікуваних результатів на наших сторінках, які можуть бути дуже дратівливими або дратувати наших кінцевих користувачів
  • Покращити безпеку наших програм, не розкриваючи інформацію, яку зловмисники можуть використовувати для атаки на наші програми
  • Винятки PHP використовуються для зміни нормального ходу програми, якщо виникає будь-яка передбачувана помилка.

Обробка помилок PHP

Коли виникає помилка, залежно від параметрів конфігурації, PHP відображає повідомлення про помилку у веб-браузері з інформацією про помилку, яка сталася.

PHP пропонує кілька способів обробки помилок. Ми розглянемо три поширені методи:

  1. Заяви Die – функція die поєднує функції echo та exit в одну. Вона дуже корисна, коли ми хочемо вивести повідомлення та зупинити виконання скрипта у разі виникнення помилки.
  2. Спеціальні обробники помилок – це визначені користувачем функції, які викликаються щоразу, коли виникає помилка.
  3. Повідомлення про помилки PHP – повідомлення про помилку залежить від ваших налаштувань звітності про помилки PHP. Цей метод дуже корисний у середовищі розробки, коли ви не знаєте, що спричинило помилку. Відображена інформація може допомогти вам налагодити вашу програму.

Приклади обробки помилок

Давайте тепер розглянемо кілька простих прикладів із процедурами обробки помилок.

Припустимо, що у нас є обчислення, яке може поділити число на нуль. Ми хочемо обробити цей випадок коректно, а не дозволити PHP вивести сиру помилку.

Наведений нижче код реалізує наведений вище приклад.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Якщо ви зберегли файл simple_error.php у папці phptuts, відкрийте URL http://localhost/phptuts/simple_error.php

Ви отримаєте такі результати.

Обробка помилок 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

Примітка: Гарною практикою безпеки є відображення повідомлення, подібного до показаного вище, замість відображення необробленого повідомлення, такого як «Файл не знайдено».

Розглянемо ще один приклад, який використовує спеціальний обробник помилок.

Спеціальний обробник помилок буде встановлено як функцію обробки помилок 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

Як видно з наведеного вище прикладу, користувацькі обробники помилок є потужними в тому сенсі, що:

  • Вони дозволяють нам налаштовувати повідомлення про помилки.
  • Налаштований обробник помилок також може включати реєстрацію помилок у файлі або базі даних, надсилання електронного листа розробнику та подібні дії.

Давайте тепер розглянемо третій тип обробки помилок. Ми будемо використовувати вбудовану функцію 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(…)» створює об’єкт винятку та передає рядок «Це приклад винятку» як параметр повідомлення.

Наведений вище код виводить таке повідомлення.

Обробка винятків PHP у PHP

Зараз ми розглянемо приклад, який реалізує винятки 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 у 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 у PHP

Поверніться до файлу PHP і передайте -1 як параметр, як показано на наступній діаграмі.

Обробка винятків PHP у PHP

Перейдіть до 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 завжди виконується, виводячи своє повідомлення про те, чи сталася помилка, чи ні.

Поширені запитання

У продакшені встановіть для display_errors значення Off та log_errors значення On у php.ini, а також вкажіть error_log на файл. Ви також можете викликати error_log('message') для запису користувацьких записів, не розкриваючи нічого відвідувачам.

try-catch обробляє винятки, що викидаються ключовим словом throw. set_error_handler перехоплює традиційні помилки та попередження PHP. У PHP 7 та пізніших версіях багато попередніх помилок викидаються як об'єкти Error, які також можна перехоплювати.

Неперехоплений виняток стає фатальною помилкою, зупиняє скрипт і виводить повідомлення про неперехоплений виняток зі стеком. trace. Глобальний обробник із set_exception_handler може перехоплювати їх як крайній засіб.

Так. Штучний інтелект може обгортати ризиковані операції в блоки try-catch, вибирати правильні типи винятків, додавати блок finally для очищення та записувати помилку в журнал. Revте, що він не обробляє винятки, вам потрібно побачити.

Так. Вставте повідомлення та tracе., а ШІ може визначити лінію, що стала причиною несправності, ланцюжок викликів, який до неї привів, та ймовірну причину, а потім запропонувати виправлення, таке як перевірка на нульове значення або виправлення аргументу.

Підсумуйте цей пост за допомогою: