Уроки PHP: Показати помилки та обробку помилок

PHP – найпопулярніша на сьогодні серверна мова веб-програмування, тому важливо знати, як вирішити будь-які помилки, які можуть виникнути при виконанні коду PHP.


У цій статті ми розглянемо основи того, як робити обробку помилок у PHP, використовуючи вбудовані функції, записувати користувальницькі функції обробці помилок та обробляти помилки винятку.

Типи помилок у PHP

Існує два основних помилки програмного забезпечення:

  • Внутрішні помилки: Це логічні помилки у вашому коді. Ці помилки можна запобігти в значній мірі ретельним програмуванням.
  • Зовнішні помилки: Це помилки, пов’язані з взаємодією зі світом поза кодом (наприклад, невдача відкрити файл або базу даних, перервати мережеве з’єднання, неможливо завантажити певний модуль PHP тощо). Ці помилки завжди будуть, але їх вплив можна пом’якшити. Чим краще ви підготуєте свій код до цих зовнішніх помилок, припускаючи якомога менше при виконанні коду, тим менше цих помилок негативно вплине на вашу програму.

Способи вирішення помилок PHP

Після того, як виникають помилки, і ми виявляємо їх, є чотири основні способи їх вирішення:

  • Показати помилку: Це дозволяє відображати помилку розробнику та / або користувачеві під час виконання програми.
  • Введіть помилку: Це дозволяє зберігати та переглядати помилки з текстового файлу журналу.
  • Закон про помилку: Тип необхідних дій буде різним для кожної програмної ситуації.
  • Ігноруйте помилку: Цього слід уникати завжди.

У цій статті ми зупинимось на відображенні, реєстрації та обробці помилок. Як тільки ви дізнаєтесь, як впоратися з помилками, ви можете легко діяти на них.

Показ помилок та налаштувань повідомлення про помилки

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

Є різні місця, де ми можемо контролювати, про які типи помилок потрібно повідомити:

  • У файлі php.ini
  • У файлі .htaccess на вашому веб-сервері
  • З вашого власного PHP-коду.

Повний опис значень конфігурації помилок PHP можна знайти тут. Це найрелевантніші параметри зі значенням за замовчуванням:

Варіанти відображення помилок PHP

Існують чотири можливі варіанти відображення помилок PHP:

  • повідомлення про помилки: Встановіть рівень повідомлення про помилки. Значенням за замовчуванням є: “E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED “, тобто цей параметр не відображає помилок рівня E_NOTICE, E_STRICT та E_DEPRECATED.
  • display_errors: Встановіть його на “УВІМКНЕНО” (за замовчуванням – “OFF”), якщо помилки повинні бути надруковані на екран.
  • log_errors: Це вказує на те, чи слід робити реєстрацію помилок чи ні; значення за замовчуванням – “увімкнено”.
  • рядок error_log: Встановлює ім’я файлу, у якому повинні бути зафіксовані помилки сценарію

Подивимося, як ми можемо використовувати ці параметри конфігурації.

Під час розробки ми можемо захотіти повернути всі повідомлення про помилки з php.ini:

1
2

display_errors = увімкнено

error_reporting = E_ALL

Ми могли зробити те ж саме з нашого PHP-коду під час виконання, зателефонувавши на функцію error_reporting ():

1 повідомлення про помилки (E_ALL);

Щоб увімкнути журнал помилок і записувати помилки до власного конкретного файлу журналу (замість файлу журналу помилок за замовчуванням, який часто є файлом журналу помилок веб-сервера або файлом syslog), ми могли налаштувати PHP за допомогою:

1
2

log_errors = увімкнено

error_log = "/tmp/php-error.log"

Тепер ви можете реєструвати помилки через ваш PHP-код:

1 error_log ( "У цьому коді є помилки!" );

Вбудовані рівні помилок

Наразі PHP має 15 заздалегідь визначених констант помилок, кожна з яких має свій ідентифікаційний номер (бітмаска). Це вбудовані типи помилок, які PHP або ви, розробник, можуть викликати, коли виникає помилка. Ви можете визначити, про які типи помилок потрібно повідомити, як ми побачимо в наступному розділі.

Це вбудовані типи помилок PHP:

Тип
Опис
E_ERRORФатальні помилки під час виконання
E_ПЕРЕДЖЕННЯПопередження про виконання (нефактичні помилки)
E_PARSEПомилки аналізу компільованого часу
E_NOTICEПовідомлення про час виконання
E_CORE_ERRORФатальні помилки, які виникають під час початкового запуску PHP
E_CORE_WARNINGПопередження (не фатальні помилки), які виникають під час початкового запуску PHP
E_COMPILE_ERRORФатальні помилки компіляції
E_COMPILE_WARNINGПопередження часу компіляції (нефатальні помилки)
E_USER_ERRORПовідомлення про помилку, створене користувачем
E_USER_WARNINGПовідомлення, створене користувачем
E_USER_NOTICEПовідомлення, створене користувачем
E_STRICTУвімкніть, щоб PHP пропонував зміни у вашому коді, що забезпечить найкращу сумісність та переадресацію вашого коду
E_RECOVERABLE_ERRORФатальна помилка, яку можна наздогнати
E_DEPRECATEDПовідомлення про час виконання
E_USER_DEPRECATEDПовідомлення, створене користувачем
E_ALLУсі помилки та попередження, як це підтримується

Ось кілька прикладів коду запускаються цих констант помилок:

1
2
3
4
5
6
7
8
9
10
11
12
13

// E_ERROR

nonExistingFunction ();

 
// E_ПЕРЕДЖЕННЯ

$ fh = fopen (‘файл не існує’, ‘r’);

 
// E_NOTICE

$ x = $ y + 5; // $ y не було визначено

 
// E_USER_ERROR

if ($ дільник == 0) {

    тригер_герр ("Неможливо поділити на нуль", E_USER_ERROR); // помилка, ініційована розробником

}

Створення власних обробників помилок

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

Ми хочемо вирішити помилку та відобразити власні повідомлення, коли сталася помилка. Для цього ми можемо використовувати функцію set_error_handler ().

Ось дуже проста спеціальна функція обробки помилок:

1
2
3
4
5
6
7
8
9
10

// функція обробника помилок

функція помилкаHandler ($ errno, $ errstr) {

  відлуння "Помилка: [$ errno] $ errstr";

}
 
// встановити обробник помилок

set_error_handler ("errorHandler");

 
// викликати помилку

ехо ($ foo); // невизначена змінна!

Отже, коли виникає помилка, функція користувальницької обробки помилок викликається аргументом числа помилок та аргументом рядка помилки. Ці два аргументи передаються з виклику set_error_handler () до нашої функції.

Ми можемо використовувати більше аргументів, як ми скоро побачимо, але вихід цього коду буде таким:

1 Помилка: [8] Не визначена змінна: foo

Давайте подивимося, як може виглядати дещо менш проста функція обробки помилок. Цей обробник помилок повинен мати можливість виявляти типи помилок і вирішувати, які дії вжити та / або яке повідомлення про помилку.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

функція errorHandler ($ errno, $ errstr, $ errfile, $ errline) {

 

    перемикач ($ errno) {

        випадок E_NOTICE:

        випадок E_USER_NOTICE:

        випадок E_DEPRECATED:

        випадок E_USER_DEPRECATED:

        випадок E_STRICT:

            відлуння ("STRICT помилка $ errstr у $ errfile: $ errline n");

            перерва;

 

        випадок E_ПЕРЕДЖЕННЯ:

        випадок E_USER_WARNING:

            відлуння ("ПОПЕРЕДЖЕННЯ помилка $ errstr при $ errfile: $ errline n");

            перерва;

 

        випадок E_ERROR:

        випадок E_USER_ERROR:

        випадок E_RECOVERABLE_ERROR:

            вихід("FATAL помилка $ errstr у $ errfile: $ errline n");

 

        за замовчуванням:

            вихід("Невідома помилка в $ errfile: $ errline n");

    }

}
 

set_error_handler ("errorHandler");

 

$ foo = хибно;

 

if (! $ foo) {

   alarm_error (‘Значення $ foo повинно бути правдою’, E_USER_NOTICE);

}

Зверніть увагу, як ми групуємо обробку певних типів помилок, використовуючи функцію пропускання операторів перемикання.

Вихід буде чимось на кшталт:

1 STRICT Помилка Значення $ foo повинно бути правдою на /tmp/test.php:32

Тепер ви можете обробляти типи помилок по-різному (або однакові) і також показувати власні повідомлення про помилку. Звичайно, реальна спеціальна функція поводження з помилками повинна мати можливість робити набагато більше з помилками та, можливо, діяти на них конкретним та розумним способом.

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

Використання винятків PHP

PHP версія 5 представила ще один спосіб поводження з помилками: Винятки.

Обробка винятків використовується для зміни нормального потоку запущеної програми, якщо виникає задана умова помилки. Це більш інтегрований із синтаксисом мовний спосіб роботи з помилками, ніж написання спеціальних функцій обробки помилок.

Винятки представлені в PHP класом Exception. Винятки створюються за допомогою синтаксису “кинути”, і їх можна знайти за допомогою синтаксичного блоку “спробувати / зловити”. Будь-який код, у якому може виникнути помилка Eexception, повинен бути розміщений у блоці “спробувати”, за яким може входити блок “уловлювання” для обробки помилки. Коли викинуті “Виключення” підключають стек коду, вони також можуть оброблятися іншими блоками “catch” у вашому коді.

Ось так виглядає синтаксис винятку:

1
2
3
4
5
6
7
8
9
10
11
12

спробуйте {// кинути помилки в блок-пробі

 

    // якщо трапляється помилка, ми можемо кинути виняток

    кинути новий виняток (“це помилка.”);

 
}

catch (Виняток $ e) {// ловити кидки у блоці catch

 

    // робити щось із об’єктом виключення, напр. відобразити своє повідомлення

    echo ‘Повідомлення про помилку:’. $ e->getMessage ();

 
}

Який результат:

1 Повідомлення про помилку: це помилка.

Після того, як об’єкт винятку буде викинутий, ми можемо отримати доступ до таких функцій-членів:

  • getMessage () отримує повідомлення про виключення
  • getPrevious () повертає попередній виняток
  • отримати код() отримує код винятку
  • getFile () отримує файл, у якому стався виняток
  • getLine () отримує рядок, у якому стався виняток
  • getTrace () отримує слід стека
  • getTraceAsString () отримує слід стека у вигляді рядка
  • __toString () – це рядкове подання Винятку
  • __clone () клонує Виняток

Ось ще один приклад обробки винятків:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ file = ‘/tmp/foo.txt’;

 

спробуйте {

    // перевірте, чи існує файл і чи він може бути записаний

    if (! file_exists ($ file) ||! is_writable ($ file)) {

 

        // якщо ні: киньте виняток

        кинути новий виняток (‘File’. $ file. ‘не знайдено або не піддається запису.’);

 

        echo (‘чи потрапить сюди код?’); // ні, якщо раніше було викинуто виняток

    }

}

улов (виняток $ e) {

    echo ‘Повідомлення про помилку:’. $ e->getMessage ();

    повернути помилкове;

}

Якщо запустити цей код, не створивши файл спочатку, ви побачите цю помилку:

1 Повідомлення про помилку: Файл /tmp/foo.txt не знайдено або не піддається запису.

Винятки піднімають стек коду, тому ми можемо мати кілька заяв про викидання в різних блоках коду і все-таки витончено обробляти їх. Однак будь-які винятки, які викидаються, але не потрапляють, призведе до помилки E_FATAL із повідомленням “Невизначене виключення”.

Приклад:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ foo = 10;

 

спробуйте {

    if (is_numeric ($ foo)) {

        якщо ($ foo > 5) {

            кинути новий виняток (“кількість зависока”); // це буде кинуто

        }

    }

    ще {

        кинути новий виняток (“не числовий тип”);

    }

}

улов (виняток $ e) {

    echo ‘Повідомлення про помилку:’. $ e->getMessage (). ‘у рядку:’. $ е->getLine ();

    // повернути помилкове;

}

Зауважте, що ми назвали «$ e->getLine () ”член-об’єкт об’єкта Exception, щоб отримати номер рядка, коли вилучення було вимкнено.

Можна вкладати декілька блоків, які намагаються підкинути один одного. Це дозволяє вказати, яка помилка винятку обробляється там, де (чистим та простим способом) у точці коду, де це має найбільше сенс. Просто пам’ятайте, що завжди ставите будь-який код, який викидається в блок “спробувати”.

Спеціальні обробники винятків

Поки ми використовували вбудований клас Exception, але ми також можемо написати власний обробник винятків, розширивши вбудований клас Exception. Це корисно, коли ми хочемо замінити вбудовані функції членів або додати нові функції учасника. Тут ви можете ознайомитись із декількома прикладними кодами.

Різниця між стандартними помилками та винятками

Стандартна обробка помилок – це старіший спосіб обробки помилок у PHP. Обробка винятків доступна лише з PHP 5 і вимагає використання об’єктно-орієнтованої структури програмування.

Обидва можна використовувати поряд. Насправді, будь-який виняток, який викидається, але не потрапляє, з часом призведе до помилки E_FATAL із повідомленням “Невизначене виключення”.

З наведеним нижче прикладом функції set_error_handler (), ми навіть можемо обробляти всі стандартні помилки як виняток:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

set_error_handler (функція ($ errno, $ errstr, $ errfile, $ errline) {

    if (error_reporting ()) {

        кинути нову ErrorException ($ errstr, 0, $ errno, $ errfile, $ errline);

    }

});

 

спробуйте {

    // E_ПЕРЕДЖЕННЯ

    $ fh = fopen (‘файл не існує’, ‘r’);

}

улов (виняток $ e) {

    echo ‘Повідомлення про помилку:’. $ e->getMessage ();

    повернути помилкове;

}

Заключне слово

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

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Adblock
    detector