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

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

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

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

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

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

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

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

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

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

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

PHP пропонує кілька способів обробки помилок.

Ми розглянемо три (3) загальновживані методи;

  1. Заяви Die– функція матриці поєднує функцію відлуння та функцію виходу в одну. Це дуже корисно, коли ми хочемо вивести повідомлення та зупинити виконання сценарію, коли виникає помилка.
  2. Спеціальні обробники помилок – це визначені користувачем функції, які викликаються щоразу, коли виникає помилка.
  3. Повідомлення про помилки 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 "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. Він має наступний базовий синтаксис

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

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

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

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

Також можна створити кілька винятків для одного оператора 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 у PHP

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

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

Перейдіть до URL-адреси http://localhost/phptuts/multiple_exceptions.php.

Які результати ви отримуєте? Передайте 3 як параметр.

Які результати ви отримуєте?

Підсумки

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